Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有x86javapath的x64机器上x86java上的JNI未满足链接错误_Java_C++_Dll_Java Native Interface - Fatal编程技术网

具有x86javapath的x64机器上x86java上的JNI未满足链接错误

具有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 {

更新: 我刚刚签出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

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
最后,我运行以下命令:

“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)

中,我猜您的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的错误