【问题标题】:Jni and shared librariesJni 和共享库
【发布时间】:2017-03-22 23:13:44
【问题描述】:

我用 Java 编写了一个程序,该程序调用了本地语言 C 中的一些函数。为该 C 函数文件创建了一个共享库,并创建了一个共享库,一切都运行良好。

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

用于加载库的 Java 代码。

static {

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

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

undefined symbol: pairing_init_set_buf

【问题讨论】:

  • 您是否以某种方式(静态或动态)链接 PBC 库?
  • 在C程序中我只包含了它们,我还要做别的吗?
  • 这取决于:您可以将库静态链接到您的共享库,或者您可以将共享 PBC 库添加到最终应用程序的链接命令中。
  • 如何将它们链接到共享的 PBC 库到最终应用程序?以及如何将共享库静态链接到我自己的共享库?
  • 切换了它们,仍然是同样的错误。我将尝试使用 dlOpen :s

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


【解决方案1】:

确保将您的 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 代码的库中不可用的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 2017-02-23
    • 2013-05-25
    • 2013-11-22
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多