【发布时间】:2014-02-05 12:35:30
【问题描述】:
我在尝试用 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
【问题讨论】:
-
看起来这可能是 Windows 如何查找二进制文件的问题。
D:\JNI存在吗? -
你的编译器是什么?显示本机函数的源代码(以及它的 java 声明)。如何导出函数?您是否以相同的位数编译您的 cpp? (32/64)。简而言之:提供更多信息
-
我已按照您的要求添加了信息。
标签: java c++ dll compilation java-native-interface