gpt4 book ai didi

java - 将 JNI 与包一起使用时如何解决 UnsatisfiedLinkError?

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:14 30 4
gpt4 key购买 nike

首先,我的示例具有以下目录结构:

Sample.c
lib/
mypackage/
--Sample.java
mypackage 中的

Sample.java 如下所示:

package mypackage;

public class Sample {
public static native int sampleMethod(int x);

public static void main(String[] args) {
System.loadLibrary("Sample");
System.out.println("sampleMethod result: " + sampleMethod(5));
}
}

我运行 javac mypackage/Sample.java 来编译 java 文件,并运行 javah mypackage.Sample 来生成 JNI header 。然后我使用以下命令编译库:

clang -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/darwin" -o lib/libSample.so -shared Sample.c

此时目录结构如下所示:

Sample.c
mypackage_Sample.h
lib/
--libSample.so
mypackage/
--Sample.java
--Sample.class

现在,当我尝试使用 java -Djava.library.path=./lib/mypackage.Sample 运行示例时,出现以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no Sample in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at mypackage.Sample.main(Sample.java:7)

我尝试指定 lib/ 的完整路径,但我得到了同样的错误。

我不确定 header 的代码和实现是否重要,但无论如何我都会发布它们。

mypackage_Sample.h:

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

#ifndef _Included_mypackage_Sample
#define _Included_mypackage_Sample
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: mypackage_Sample
* Method: sampleMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_mypackage_Sample_sampleMethod
(JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

示例.c:

#include "mypackage_Sample.h"
#include <stdio.h>

JNIEXPORT jint JNICALL Java_mypackage_Sample_sampleMethod
(JNIEnv * env, jclass obj, jint num) {
return num * num;
}

我在 OS X Yosemite 10.10.5 上使用 clang 7.0.2java 1.8.0_101 运行它。

最佳答案

您的库文件 (libSample.so) 中的名称似乎有误。

如果您使用:

System.loadLibrary("Sample");

JVM 会将此名称映射到特定于平台的文件名以尝试加载。在 Linux 上是 libSample.so,在 Windows 上是 Sample.dll,但在 OS X 上是其他东西。

您可以通过查看输出来找出您的库文件应具有的名称:

System.mapLibraryName("Sample");

在目标平台上调用。

之后,您可以将其用作您的库文件的名称。

关于java - 将 JNI 与包一起使用时如何解决 UnsatisfiedLinkError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44440109/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com