我在Java中创建了一个用本机语言调用某些函数的程序。制作了一个C函数文件的共享库并创建了一个共享库,并且所有函数都完美无缺。
我的问题是当我尝试调用其他功能时,例如在PBC(基于配对的密码学)库中。共享库中的C文件包含所需的.h文件,用于了解PBC中的功能但我不能使用它们,我不知道为什么。我该怎么办?如何调用其他库中的函数?
用于加载库的Java代码。
static {
System.loadLibrary("myLibrary");
System.loadLibrary("pbc");
}
执行我自己的Java程序时出错:
undefined symbol: pairing_init_set_buf
答案 0 :(得分:1)
确保将您的JNI代码与您要使用的共享库相关联。
您可以在此处查看示例代码:
https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo023
在此示例中,您具有JNI功能:
JNIEXPORT void JNICALL Java_recipeNo023_HelloWorld_displayMessage
(JNIEnv *env, jclass obj) {
printf("Hello world!\n");
/* We are calling function from another source */
anotherFunction();
}
从一些外部共享库调用函数
void anotherFunction() {
// we are printing message from another C file
printf("Hello from another function!\n");
}
您必须确保您的JNI库与您要使用的库链接:
cc -g -shared -fpic -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(ARCH) c/recipeNo023_HelloWorld.c -L./lib -lAnotherFunction -o lib/libHelloWorld.$(EXT)
在此示例中
-L./lib -lAnotherFunction
告诉编译器使用这个包含JNI代码的库中不可用的符号的“其他”库。