JNI和共享库

4
我已经用Java编写了一个程序,调用了一些本地语言C中的函数。制作了该C函数文件的共享库并制作了一个共享库,一切都运行得很完美。
我的问题是,当我尝试调用其他函数时(例如PBC(基于配对的加密)库中的函数),就会出现问题。共享库中的C文件包括所需的.h文件以了解PBC中的函数,但我无法使用它们,不知道为什么。我该怎么做?如何调用其他库中的函数?
以下是加载库的Java代码。
static {

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

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

undefined symbol: pairing_init_set_buf

你是否在某种程度上(静态或动态地)链接了PBC库? - LPs
在C程序中,我只包含了它们,我需要做些其他的事情吗? - Tortxu13
我该如何将它们链接到共享的PBC库中,以便最终应用程序可以使用?另外,我该如何将该共享库静态地链接到我的自己的共享库中? - Tortxu13
你是如何将本地的C库链接到你的应用程序中的?PBC库也是同样的方式... - LPs
1
已经交换了它们,但仍然出现相同的错误。我将尝试使用dlOpen :s - Tortxu13
显示剩余4条评论
1个回答

4

请确保将JNI代码与您想要使用的共享库链接。

您可以在此处查看示例代码:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/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代码库中不可用符号的“其他”库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接