使用 Java 本机接口时出错

Error using Java Native Interface

本文关键字:出错 接口 本机 Java 使用      更新时间:2023-10-16

我正在尝试开发一个使用c ++代码的java程序。为此,我使用了 32 位 mingw、32 位 jre(版本 1.8.0_77)和 eclipse luna(64 位)。

问题所在

我在尝试加载 *.dll 时遇到问题。(我还没有尝试运行任何方法)

我测试过什么

这是我声明本机方法的类:

public class JniImports {
    static{
        System.loadLibrary("hello");
    }
    public int test(int n){
        return testJava(n);
    }
    private native int testJava(int n);
}

这是主要方法:

public class Main {
    public static void main(String[] args) {
        JniImports a = new JniImports();
    }
}

我已经配置了日食 JVM 的参数,并添加了以下内容:-Djava.library.path=./jni

c-head文件是由javah工具生成的,所以我确定没问题。无论如何,正如我所说,我没有尝试执行任何方法。这里是头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jnitest_JniImports */
#ifndef _Included_com_jnitest_JniImports
#define _Included_com_jnitest_JniImports
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jnitest_JniImports
 * Method:    testJava
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_jnitest_JniImports_testJava
  (JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif

这里是 cpp 文件:

#include "com_jnitest_JniImports.h"
JNIEXPORT jint JNICALL Java_com_jnitest_JniImports_testJava
  (JNIEnv *env, jobject _this, jint n){
      return 12;
}

这是我用来编译的命令(g++ 是 mingw 32 位): g++ -Wl,--add-stdcall-alias -I"%JDK32_HOME%include" -I"%JDK32_HOME%includewin32" -shared -o hello.dll com_jnitest_JniImports.cpp

错误

如果我使用 64 位 JRE

,错误是它无法在 64 位 JRE 上加载 32 位 dll:

java.lang.UnsatisfiedLinkError: D:wstestjnijnihello.dll Can't load IA 32-bit .dll on a AMD 64-bit platform

我认为此错误表明,在这种情况下,JRE 找到了 *.dll。

如果我使用 32 位 JRE,错误是它找不到 *.dll:

java.lang.UnsatisfiedLinkError: D:wstestjnijnihello.dll: Can't find dependent libraries

如果我使用 32 位 JRE 并删除 hello.dll 库,则错误如下: java.lang.UnsatisfiedLinkError: no hello in java.library.path

因此,使用 32 位编译器编译 c++ 代码并使用 32 位 JRE,它可以找到 dll,但无论如何它都会崩溃。

我还尝试在调试模式下编译 c++ 代码(使用 -g 标志),但它也会崩溃。

我确定 dll 在正确的位置,因为如果我复制粘贴窗口资源管理器路径栏中错误日志中显示的路径,它会将我带到 dll 所在的文件夹,并且我确定它的名称是"hello.dll"。

我已经用最新版本的 eclipse(32 位)对其进行了测试,它可以工作。我不知道这是一个日食错误,还是问题在于我使用的是 64 位日食,现在我使用的是 32 位日食。