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

标签 java c++ java-native-interface codeblocks unsatisfiedlinkerror

我正在尝试使用 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/

相关文章:

c++ - set_union 与 multiset 容器?

c++ - 输出 float 而不以零结尾的 sprintf() 模式是什么?

java - 通过 JNI 将 float[][] 传递给 C++ 的最简单方法

java - 适用于 64 位处理器的 JMagick.dll

java - AndEngine粒子系统

java - 在 Java 中合并 double 类型数组

java - 使用 Retrofit、RxJava 和 Observable.share 进行重新身份验证?

c++ - boost 反序列化优化?

Android NDK,没有规则来制定目标

java - 为什么Java禁止内部类中的静态字段?