首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决与包一起使用JNI时的UnsatisfiedLinkError?

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

Stack Overflow用户
提问于 2017-06-08 15:40:32
回答 1查看 636关注 0票数 1

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

代码语言:javascript
运行
复制
Sample.c
lib/
mypackage/
--Sample.java

Sample.java in mypackage如下所示:

代码语言:javascript
运行
复制
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头。然后使用以下命令编译库:

代码语言:javascript
运行
复制
clang -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/darwin" -o lib/libSample.so -shared Sample.c

此时,目录结构如下所示:

代码语言:javascript
运行
复制
Sample.c
mypackage_Sample.h
lib/
--libSample.so
mypackage/
--Sample.java
--Sample.class

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
/* 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

代码语言:javascript
运行
复制
#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运行这个程序。

EN

Stack Overflow用户

回答已采纳

发布于 2017-06-08 16:02:47

看起来,您从库文件(libSample.so)中得到了错误的名称。

如果你使用:

代码语言:javascript
运行
复制
System.loadLibrary("Sample");

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

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

代码语言:javascript
运行
复制
System.mapLibraryName("Sample");

呼叫目标平台。

之后,您可以使用它作为库文件的名称。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44440109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档