我正在尝试实施此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中方法的类型?
答案 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添加到本机方法签名中。
如果您描述了这些方法应该做什么,我可以提出更好的建议。