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

伊瓦伊洛·托斯科夫

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

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

Sample.javamypackage看起来像这样:

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头文件。然后我使用以下命令编译库:

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/,但出现相同的错误。

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

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

Sample.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.2运行它java 1.8.0_101

乔恩·凡尼

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

如果您使用:

System.loadLibrary("Sample");

JVM 会将此名称映射到特定于平台的文件名以尝试加载。在 Linux 上是这样libSample.so,在 Windows 上是这样Sample.dll,但在 OS X 上则是另外一回事。

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

System.mapLibraryName("Sample");

在目标平台上调用。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++ JNI UnsatisfiedLinkError

将应用程序与REPL一起使用时如何解决承诺

将Nlog与Costura Fody一起使用时如何解决错误

如何修复JNI项目中的UnsatisfiedLinkError(找不到依赖库)

ECLIPSE-使用JNI时出现java.lang.UnsatisfiedLinkError

在ubuntu上使用JNI时出现java.lang.UnsatisfiedLinkError

Java中的UnsatisfiedLinkError,来自JNI

JNI java.lang.UnsatisfiedLinkError

无法将 DefineClass (JNI) 与 Qt 资源一起使用

将foreach与Enum.GetValues()一起使用时,如何解决代码分析警告CS8605?

在将typedelmapper与类型映射一起使用时,如何解决不兼容的类型(不可转换)

如何解决 UnsatisfiedLinkError?

我应该如何为JNI加载本机库以避免UnsatisfiedLinkError?

如何修复 Java 15 JNI“UnsatisfiedLinkError:动态链接库 (DLL) 初始化例程失败”

使用dll和Java jni4net时出现UnsatisfiedLinkError异常

JNI-UnsatisfiedLinkError-loadLibrary始终失败

Tomcat中的共享JNI库(.so)-UnsatisfiedLinkError

JNI C ++调用方法时出现UnsatisfiedLinkError

由于某些开销,将OpenCL与Android JNI一起使用会产生缓慢的代码

UnsatisfiedLinkError与vaadin一起使用JSNI

如何将 ATTR 与固定 LOD Tableau 或任何解决方法一起使用?

如何解决不要直接改变状态。将setState()与数组一起使用?

JNI:如何将GetMethodID用于getScanResults

将“ apt-get remove”与通配符一起使用时,如何排除一组软件包?

JNI java.lang.UnsatisfiedLinkError,无法链接方法

JNI- java.lang.UnsatisfiedLinkError:找不到本机方法

Ecplise Java JNI, java.lang.UnsatisfiedLinkError loading dll

使用 PHP 时发布请求有效,但是当我将 Axios 与 React 一起使用时它失败并显示 500 内部错误,我该如何解决?

在Android BroadcastReceiver中使用Jsoup时如何解决“ UnsatisfiedLinkError”?