嘗試在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
看起來這可能是Windows如何查找二進制文件的問題。 D:\ JNI存在嗎? – Joni
你的編譯器是什麼?顯示原生函數的源代碼(以及它的java聲明)。你如何導出函數?你是否用相同的位數編譯你的cpp? (32/64)。簡而言之:提供更多信息 – manuell
我已經按照您的要求添加了信息。 – suryakrish