在独立本机库中调用本机库方法

时间:2015-02-20 17:10:50

标签: android c android-ndk java-native-interface

我正在尝试实施此stackoverflow post中所述的解决方案。

正如解决方案所示,我创建了一个独立的本机库。这就是我到目前为止实现该库的方式。

#include "zoom_Main_VideoPlayer.h"
#include <dlfcn.h>

void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function

JNIEXPORT void JNICALL Java_zoom_render_RenderView_naClose(JNIEnv *pEnv, jobject pObj) {

    handle = dlopen("path to nativelibrary1.so", RTLD_LAZY);
    myFunctionName = (func)dlsym(handle, "Close");
    myFunctionName(1); // passing parameters if needed in the call
    dlclose(handle);
    return;
}

根据解决方案,构建另一个独立的本机库(实用程序库)来加载和卸载其他库。因此,我试图在这个独立的库中加载和卸载nativelibrary1。例如,此其他本机库中的本机方法是

// native method in nativelibrary1
JNIEXPORT void JNICALL Java_zoom_render_RenderView_naClose(JNIEnv *pEnv, jobject pObj) {

    if (!is) {
        do_exit(is);
    }
    else {
        do_exit(NULL);
    }

    LOGI(0, "Clean-up done");
}

我不确定我应该如何修改nativelibrary1,因为它们不再是直接在java代码中调用的本机方法( nativelibrary1 lib没有直接加载到java代码的静态块中< / em>的)。

我是否应该更改typedef int (*func)(int); // define function prototype以适合nativelibrary1中方法的类型?

1 个答案:

答案 0 :(得分:0)

有点不清楚你希望函数做什么,但是如果我理解,你希望你的Java可调用库如下所示(假设&#34; C&#34;不是C ++)

#include "zoom_Main_VideoPlayer.h"
#include <dlfcn.h>
void *handle;
typedef void (*func)(); // define function prototype
func myFunctionName; // some name for the function
JNIEXPORT void JNICALL Java_zoom_render_RenderView_naClose(JNIEnv *pEnv, jobject pObj) {

    handle = dlopen("path to nativelibrary1.so", RTLD_LAZY);
    myFunctionName = (func)dlsym(handle, "Close");
    myFunctionName(); // passing parameters if needed in the call
    dlclose(handle);
    return;
}

你的另一个图书馆将是:

// native method in nativelibrary1
void Close() {
    if (!is) {
        do_exit(is);
    }
    else {
        do_exit(NULL);
    }
    LOGI(0, "Clean-up done");
}

因为Close()没有任何参数。您也可以将Java方法设置为静态,以便将伪假的pObj添加到本机方法签名中。

如果您描述了这些方法应该做什么,我可以提出更好的建议。