有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有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) 个答案

  1. # 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可能就足够了