更新: 我刚刚检查了 DLL 程序集,程序显示 DLL 的错误如下:
错误:由于隐式依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。 错误:发现具有不同 CPU 类型的模块。
我已经尝试开发 JNI 实现 2 天了......
我的笔记本电脑是 x64,我的机器上同时安装了 x64 和 x86 java.. 但是java环境变量设置为x64版本。
我正在做 x86 java 上的所有工作,编译, header 生成 并且我还在 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 生成 header
"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 .;例1
然后出现这个错误:
线程“main”中的异常 java.lang.UnsatisfiedLinkError: Ex1.startProcess()V
在 Ex1.startProcess( native 方法)
在 Ex1.main (ex1.java:20)
最佳答案
我猜你的 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可能就足够了。
关于java - 使用 x86javapath 的 x64 机器上的 x86java 上的 JNI 不满足链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11052777/