2014-02-05 65 views
0

嘗試在C++中編寫JNI時出現以下錯誤。使用JNI時出現UnsatisfiedLinkError

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輪候冊, - 附加STDCALL別名-I 「\包括」 -I 「\包括\ WIN32」 - 共享-o hello.dll HelloJNI.cpp

+1

看起來這可能是Windows如何查找二進制文件的問題。 D:\ JNI存在嗎? – Joni

+1

你的編譯器是什麼?顯示原生函數的源代碼(以及它的java聲明)。你如何導出函數?你是否用相同的位數編譯你的cpp? (32/64)。簡而言之:提供更多信息 – manuell

+0

我已經按照您的要求添加了信息。 – suryakrish

回答

0

嘗試使用g++代替gcc編譯器。確實,這些通常是別名,但g++負責標準庫和CC++之間的幾乎ABI差異。

另外請注意,JNI本質上是一個ç接口,因此你需要

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

有時,extern "C"屬性從javah繼承 - 生成.H文件。

我真誠地不明白爲什麼標準jni.h文件無法定義JNIEXPORT來包含此屬性。

+0

我有我的問題解決了錯誤是由於錯誤的dll文件我的是一個64位系統gcc創建了一個32位的DLL,所以DLL無效使用Visual C++編譯器生成64位的dll文件工作正常 – suryakrish

0

我有我的問題解決了錯誤是由於錯誤的dll文件我的是一個64位系統,但海灣合作委員會創建了一個32位的DLL,所以DLL是runtinme無效。然後,我用一個visual C++編譯器生成64位的dll文件,效果很好。