gpt4 book ai didi

java - JNI : Library is Found on Path, 但方法不是 (java.lang.UnsatisfiedLinkError)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:40 29 4
gpt4 key购买 nike

我正在尝试使用 JNI 并获取 java.lang.UnsatisfiedLinkError。与其他数百万个问题不同,我在我的路径上有这个库,甚至在我删除它时看到了异常变化。我确定我创建的 dll 有问题,但我不确定是什么。

这是我的java类代码:

package com;

public class Tune {
static {
System.loadLibrary("lala");
}
public static void main(String[] args) {
Tune j = new Tune();
System.out.println("2+6="+j.add(2, 6));
}
native public int add(int x,int y);
}

这是我的 javah 生成的头文件的删节部分:

/*
* Class: com_Tune
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_Tune_add
(JNIEnv *, jobject, jint, jint);

这是我的 C++ 代码:

#include <jni.h>
#include <com_Tune.h>

JNIEXPORT jint JNICALL Java_com_Tune_add
(JNIEnv * env, jobject obj, jint x, jint y) {
return x+y;
}

这是我从 eclipse 得到的运行时异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.Tune.add(II)I
at com.Tune.add(Native Method)
at com.Tune.main(Tune.java:9)

我读到上面的异常意味着它确实找到了库“lala”,但是方法“add”仍然没有定义。我看到我的项目和教程之间唯一不同的地方是:

  • 我使用的是一个包,而不是默认包(教程真的不应该这样做吗?!?!来吧,让我们变得专业一点)
    • 我的有返回值。
    • 我在创建 dll 后移动了它(我不认为这会破坏它,因为我的路径已配置。)

这怎么可能?

其他信息:

操作系统:Windows 7
JDK: 1.6.0_31 (x86, 32 位 jvm)
C++ IDE: Code::Blocks (dll 由 Code::Blocks IDE 自动编译)
C++ 编译器:MinGW32-g++(GNU C++ 编译器)

我在 C:\_\include 中有 jni.h 和 com_Tune.h
我在 C:\_\lib 中有 lala.dll

环境变量:
路径:C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;%CommonProgramFiles%\Microsoft Shared\Windows Live;C:\Program Files (x86)\AMD APP\bin\x86_64;C:\Program Files ( x86)\AMD APP\bin\x86;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Apps;%JAVA_HOME%\bin;C:\Program Files\MySQL\MySQL Server 5.5\bin;%MAVEN_HOME%\bin;%HADOOP_INSTALL%\bin;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\MinGW\bin;C:\Program Files (x86)\GnuWin32\bin;C:_\path;C:\_\lib;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin;C:\_\包含

最佳答案

问题出在编译器生成的名称上:Java_com_Tune_add@16

使用两者之一

gcc -Wl,-kill-at

或者

gcc -Wl,--add-stdcall-alias

这将确保生成 Java_com_Tune_add

然后你的方法调用就会成功。

关于java - JNI : Library is Found on Path, 但方法不是 (java.lang.UnsatisfiedLinkError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367700/

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