JNI 在具有 x86javapath 的 x64 计算机上的 x86java 上出现未满足的链接错误
JNI Unsatisfied Link Error on x86java on x64machine with x86javapath
更新:我只是检查DLL程序集,程序显示DLL的错误如下:
错误:由于隐式依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。错误:找到具有不同 CPU 类型的模块。
我已经尝试开发 JNI 实现 2 天了......
我的笔记本电脑是x64,我的机器上安装了x64和x86 java。但是 Java 环境变量设置为 x64 版本。
我正在做x86 java的所有工作,编译,标头生成我还在VS32上为win32编译DLL2010
首先,我将java类编码为:
例1.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
例1.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文件,然后我实现的功能为:
例1.cpp
#include <jni.h>
JNIEXPORT void JNICALL Java_Ex1_startProcess(JNIEnv * env, jobject job){
return;
}
然后我将项目编译为 ex1.dll
然后我把以下文件放在 C:/jni1/上
- 例1.H
- 例1.java
- 例1.class
- 例1.dll
最后,我运行以下命令:
"C:\Program Files (x86)\Java\jdk1.7.0_05\bin\java.exe" -classpath .;例1
然后发生此错误:
线程"main"中的异常 java.lang.UnsatisfiedLinkError: Ex1.startProcess()V
at Ex1.startProcess (Native Method)
在 Ex1.main (ex1.java:20)
我猜您的 32 位 DLL 依赖于系统 DLL,并尝试使用 System32 中的那些,尽管名称是 64 位,而不是恰好在 SysWoW64 中的 32 位。作为证明,我会尝试将您的 DLL 编译为 64 位并尝试通过 64 位 JVM 运行。这应该开箱即用。但是,我无法帮助强制您的 32 位 DLL 使用 32 位依赖项。从来没有这样做过,它可能涉及一些棘手的文件复制到您的 JNI DLL 所在的位置,和/或注册表魔法。尽管通过 32 位工具进行正确的 DLL 注册可能就足够了。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 模板参数替换失败,并且未完成隐式转换
- 编译时未启用intel oneApi CUDA支持
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 未在作用域中声明unordered_map
- 错误:未在此范围内声明'reverse'
- node-gyp 在 macOS 上未正确链接库
- 编译C++时未定义的引用
- 在未初始化映射的情况下,将值插入到映射的映射中
- AES加密到解密未正确输出
- 当满足条件时,While循环未结束
- 在未满足条件时的任何时刻结束一个段循环
- 如果满足嵌套条件,则计算结果未显示结果C
- 满足退出条件时程序未退出
- JNI 在具有 x86javapath 的 x64 计算机上的 x86java 上出现未满足的链接错误
- 未满足的依赖项:xscrnsaver
- 我的代码有什么问题..而满足条件时循环未关闭
- 如果未满足某些条件,从方法返回什么?
- 模板参数未满足所有要求
- 我的循环条件未得到满足