具有x86javapath的x64机器上x86java上的java JNI未满足链接错误
更新: 我刚刚签出DLL程序集,程序显示DLL的错误,如下所示:
错误:由于隐式相关模块中缺少导出函数,至少有一个模块具有未解析的导入。 错误:找到具有不同CPU类型的模块强>
我已经尝试开发一个JNI实现两天了
我的笔记本电脑是x64,我的机器上安装了x64和x86 java。。 但是java环境变量设置为x64版本
我正在做x86Java的所有工作,编译,头生成 我还在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();
}
}
然后我用x86javac编译这个java文件
“C:\ProgramFiles(x86)\Java\jdk1.7.0\u 05\bin\javac.exe”Ex1。java
然后我用x86javah生成头文件
“C:\ProgramFiles(x86)\Java\jdk1.7.0\u 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项目,设置为dll&;vs2010上的空项目。 将javah生成的头文件添加到头文件中,然后创建与头文件同名的cpp文件,然后实现如下功能:
Ex1。cpp
#include <jni.h>
JNIEXPORT void JNICALL Java_Ex1_startProcess(JNIEnv * env, jobject job){
return;
}
然后我将项目编译为ex1。dll
然后我将以下文件放在C:/jni1上/
- 例1。h
- 例1。爪哇
- 例1。阶级
- 例1。动态链接库
最后,我运行以下命令:
“C:\ProgramFiles(x86)\Java\jdk1.7.0\u 05\bin\Java.exe”-类路径。;Ex1
然后发生此错误:
线程“main”java中出现异常。lang.UnsatifiedLink错误:Ex1。startProcess()V
在Ex1。startProcess(本机方法)
在Ex1。main(ex1.java:20)
# 1 楼答案
我猜您的32位DLL依赖于系统DLL,并尝试使用来自System32的DLL,尽管名称为64位,但不是碰巧在SysWoW64中的32位。作为证明,我将尝试将您的DLL编译为64位,并尝试在64位JVM中运行。这应该是现成的。但是,我无法帮助您强制32位DLL使用32位依赖项。从来没有这样做过,它可能涉及到一些tricky copying of files到JNI DLL所在的位置,和/或registry magic。虽然proper DLL registration through 32bit tool可能就足够了