使用JNI时出现UnsatisfiedLinkError

时间:2014-02-05 12:35:30

标签: java c++ dll compilation java-native-interface

尝试在C ++中编写JNI时出现以下错误。

Exception in thread "main" java.lang.UnsatisfiedLinkError: D:\JNI examples\cfiles\hello.dll: %1 is not a valid Win32 application
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at HelloJNI.<clinit>(HelloJNI.java:3)
Could not find the main class: HelloJNI.  Program will exit.

仅从.cpp文件生成的.dll文件中弹出错误。

如果.dll文件是从.c文件生成的,则它不会显示任何错误,从而提供正确的输出。

D:\ JNI文件夹存在并且可以正常用于.c文件。我使用GCC vesion 4.7.0编译器生成dll文件。 你好JNI.java

public class HelloJNI {
static {
  System.loadLibrary("hello"); // hello.dll (Windows) or libhello.so (Unixes)
}
// A native method that receives nothing and returns void
private native void sayHello();

public static void main(String[] args) {
   new HelloJNI().sayHello();  // invoke the native method
}
}

HelloJNI.cpp

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"
#include <iostream>

using namespace std;

 JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");

cout<<"Hello";

return;
}
  

gcc -Wl, - add-stdcall-alias -I“\ include”-I“\ include \ win32”-shared -o hello.dll HelloJNI.cpp

2 个答案:

答案 0 :(得分:0)

尝试使用g++代替gcc编译器。这些通常是别名,但是g++负责标准库和 C C ++ 之间的小ABI差异。

另外,请注意JNI本质上是 C 接口,因此您需要

 extern "C" JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj)

有时,extern "C"属性继承自javah生成的 .h 文件。

我真诚地不明白为什么标准jni.h文件无法定义JNIEXPORT来包含此属性。

答案 1 :(得分:0)

我解决了我的问题错误是由于错误的dll文件我的是一个64位系统但是gcc创建了一个32位的dll所以dll在runtinme时无效。然后,我使用可视化C ++编译器生成64位的dll文件。