【问题标题】:JNI Unsatisfied Link Error on x86java on x64machine with x86javapath带有 x86javapath 的 x64machine 上的 x86java 上的 JNI Unsatisfied Link Error
【发布时间】:2012-06-18 15:32:51
【问题描述】:

更新: 我刚刚检查了 DLL 程序集,程序显示 DLL 的错误如下:

错误:由于隐式依赖模块中缺少导出函数,至少一个模块具有未解析的导入。 错误:发现具有不同 CPU 类型的模块。

我已经尝试开发 JNI 实现 2 天了...

我的笔记本电脑是 x64,我的机器上安装了 x64 和 x86 java。 但是java环境变量设置为x64版本。

我正在做所有关于 x86 java、编译、头文件生成的工作 我还在 vs2010 上为 win32 编译 dll

首先我将java类编码为:

Ex1.java

public class Ex1 {
    // Load the dll that exports functions callable from java
    static {System.loadLibrary("ex1");}

    public native void startProcess();

    public void Test() {
    }

    public static void main(String [] args) {
        Ex1 t = new Ex1();
        t.startProcess();
    }

}

然后我用 x86 javac 编译这个 java 文件

“C:\Program Files (x86)\Java\jdk1.7.0_05\bin\javac.exe”Ex1.java

然后我用 x86 javah 生成头文件

“C:\Program Files (x86)\Java\jdk1.7.0_05\bin\javah.exe”Ex1

Ex1.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Ex1 */

#ifndef _Included_Ex1
#define _Included_Ex1
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Ex1
 * Method:    startProcess
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Ex1_startProcess
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

然后我开始一个新的 Win32 项目,在 vs2010 上设置为 dll 和空项目。 并将javah生成的头文件添加到头文件中,然后我创建与头文件同名的cpp文件,然后我将函数实现为:

Ex1.cpp

#include <jni.h>

JNIEXPORT void JNICALL Java_Ex1_startProcess(JNIEnv * env, jobject job){
    return;
}

然后我将项目编译为 ex1.dll

然后我将以下文件放在 C:/jni1/ 上

  • ex1.h
  • ex1.java
  • ex1.class
  • ex1.dll

最后,我运行以下命令:

"C:\Program Files (x86)\Java\jdk1.7.0_05\bin\java.exe" -classpath .; Ex1

那么就会出现这个错误:

线程“main”中的异常 java.lang.UnsatisfiedLinkError: Ex1.startProcess()V
在 Ex1.startProcess(本机方法)
在 Ex1.main (ex1.java:20)

【问题讨论】:

  • 您确定您的图书馆已找到。也许您需要将java.library.path 设置为指向您的DLL 位置。
  • 我在 cmd 位于 C:\jni1\ 时运行此命令 -> "C:\Program Files (x86)\Java\jdk1.7.0_05\bin\java.exe" -classpath .; Ex1
  • 如果您的 dll 位于 C:\jni1,则将 -Djava.library.path=C:\jni1 添加到您的 cmd。如果它在不同的地方添加设置相应的路径。
  • 您还可以使用 System.load(full_path_including_extension) 提供 dll 的完整路径,以确保您的 dll 按预期工作
  • error for missing dll is no ex1dll found in java.library.path

标签: java c++ dll java-native-interface


【解决方案1】:

我猜你的 32 位 DLL 依赖于系统 DLL,并尝试使用 System32 中的那些,尽管名称是 64 位,而不是 SysWoW64 中的 32 位。作为证明,我会尝试将您的 DLL 编译为 64 位并尝试通过 64 位 JVM 运行。这应该开箱即用。但是,我无法强制您的 32 位 DLL 使用 32 位依赖项。从来没有这样做过,它可能涉及一些tricky copying of files 到您的 JNI DLL 所在的位置,和/或registry magic。虽然proper DLL registration through 32bit tool 可能就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    相关资源
    最近更新 更多