具有x86javapath的x64机器上x86java上的JNI未满足链接错误
更新: 我刚刚签出DLL程序集,程序显示DLL的错误,如下所示: 错误:由于隐式相关模块中缺少导出函数,至少有一个模块具有未解析的导入。 错误:找到具有不同CPU类型的模块。 我已经尝试开发一个JNI实现两天了 我的笔记本电脑是x64,我的机器上安装了x64和x86 java。。 但是java环境变量设置为x64版本 我正在做x86Java的所有工作,编译,头生成 我还在vs2010上编译win32的dll 首先,我将java类编码为: Ex1.java具有x86javapath的x64机器上x86java上的JNI未满足链接错误,java,c++,dll,java-native-interface,Java,C++,Dll,Java Native Interface,更新: 我刚刚签出DLL程序集,程序显示DLL的错误,如下所示: 错误:由于隐式相关模块中缺少导出函数,至少有一个模块具有未解析的导入。 错误:找到具有不同CPU类型的模块。 我已经尝试开发一个JNI实现两天了 我的笔记本电脑是x64,我的机器上安装了x64和x86 java。。 但是java环境变量设置为x64版本 我正在做x86Java的所有工作,编译,头生成 我还在vs2010上编译win32的dll 首先,我将java类编码为: Ex1.java public class Ex1 {
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
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();
}
}
然后我用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
/*不要编辑此文件-它是机器生成的*/
#包括
/*类Ex1的标头*/
#如果不包括(Ex1)
#定义_包含_Ex1
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:Ex1
*方法:startProcess
*签字:()五
*/
JNIEXPORT void JNICALL Java\u Ex1\u startProcess
(JNIEnv*,jobject);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
然后我启动一个新的Win32项目,在vs2010上设置为dll&empty项目。
将javah生成的头文件添加到头文件中,然后创建与头文件同名的cpp文件,然后实现如下功能:
Ex1.cpp
#include <jni.h>
JNIEXPORT void JNICALL Java_Ex1_startProcess(JNIEnv * env, jobject job){
return;
}
#包括
JNIEXPORT void JNICALL Java_Ex1_startProcess(JNIEnv*env,jobject作业){
返回;
}
然后我将项目编译为ex1.dll
然后我将以下文件放在C:/jni1上/
- 例1.h
- ex1.java
- ex1.class
- ex1.dll
在Ex1.startProcess(本机方法)
在Ex1.main(Ex1.java:20)
中,我猜您的32位DLL依赖于系统DLL,并尝试使用来自System32的DLL,尽管名称是64位,但不是碰巧在SysWoW64中的32位。作为证明,我将尝试将您的DLL编译为64位,并尝试在64位JVM中运行。这应该是现成的。但是,我无法帮助您强制32位DLL使用32位依赖项。从来没有这样做过,它可能涉及到一些JNI DLL所在的位置,和/或。不过可能已经足够了。您肯定找到了您的库。也许您需要将
java.library.path
设置为指向DLL位置。当cmd位于C:\jni1 \->“C:\Program Files(x86)\java\jdk1.7.0\u 05\bin\java.exe”-类路径中时,我运行此命令。;EX1如果dll位于C:\jni1
中,则将-Djava.library.path=C:\jni1
添加到cmd中。如果它位于其他位置,请添加并设置相应的路径。您也可以使用System.load(完整路径,包括扩展名)提供dll的完整路径,以确保您的dll按预期工作。在java.library.path中找不到缺少dll的错误