【问题标题】:Java not loading dependent librariesJava不加载依赖库
【发布时间】:2016-10-18 23:51:26
【问题描述】:

我第一次尝试使用 JNI,但是当我运行我的 java 程序时,我不断收到UnsatisfiedLinkError。该错误说它找不到我的依赖库。我确实看到了JNI Hello World Unsatisfied Link Error 的问题,但他们的建议不起作用。作为旁注,我没有 Microsoft Visual Studio,我在 Windows 10 上运行。

我正在使用以下命令来编译和运行我的程序:

javac HelloWorld.java

javah HelloWorld

gcc -Wl,--add-stdcall-alias -I"C:/Program Files/Java/jdk1.8.0_91/include" -I"C:/Program Files/Java/jdk1.8.0_91/include/win32" -shared -o HelloWorld.dll HelloWorld.c

java -Djava.library.path=. HelloWorld

源代码:

Java 源代码 (HelloWorld.java):

public class HelloWorld {
    static {
        System.loadLibrary("HelloWorld");
    }
    private static native void sayHello();
    public static void main(String[] args) {
        sayHello();
    }
}

生成的头文件(HelloWorld.h):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_sayHello
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

C 文件(HelloWorld.c):

#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"

JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv *env, jclass cls) {
    printf("C says hello!");
}

【问题讨论】:

  • 解决方案是确保依赖库通过 PATH 可用。
  • 路径是指环境变量还是命令本身?
  • 您确定 JRE 和库具有相同的架构(32/64 位)吗?

标签: java c java-native-interface


【解决方案1】:

在这里查看一个简单的 HelloWorld 示例:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo001

(Linux/OSX)。

如果您想使用共享库,请确保 JVM 可以看到它。您可以使用:“-Djava.library.path=”,或者您应该确保库位于 LD_LIBRARY_PATH 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2011-07-22
    • 2011-01-01
    • 2015-03-19
    • 1970-01-01
    • 2015-12-13
    • 2017-11-16
    相关资源
    最近更新 更多