Jni和共享库

时间:2016-11-09 07:34:29

标签: java c java-native-interface shared-libraries static-libraries

我在Java中创建了一个用本机语言调用某些函数的程序。制作了一个C函数文件的共享库并创建了一个共享库,并且所有函数都完美无缺。

我的问题是当我尝试调用其他功能时,例如在PBC(基于配对的密码学)库中。共享库中的C文件包含所需的.h文件,用于了解PBC中的功能但我不能使用它们,我不知道为什么。我该怎么办?如何调用其他库中的函数?

用于加载库的Java代码。

static {

    System.loadLibrary("myLibrary");
    System.loadLibrary("pbc");
}

执行我自己的Java程序时出错:

undefined symbol: pairing_init_set_buf

1 个答案:

答案 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代码的库中不可用的符号的“其他”库。