使用JNI时出现java不满意链接错误
在尝试用C++编程JNI时,我会遇到以下错误。p>
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.
该错误仅针对以下情况弹出。dll文件生成的一个。cpp文件
如果是的话。dll文件是从一个。c文件,它不显示任何错误,给出正确的输出
D:\JNI文件夹存在,可以正常工作。c文件。我使用GCC vesion 4.7.0编译器生成dll文件。 你好,JNI。爪哇
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
}
}
你好。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
# 1 楼答案
我已经解决了我的问题错误是由于错误的dll文件我是一个64位系统,但gcc创建了一个32位dll,因此dll在运行时无效。然后我用Visual C++编译器生成一个DLL文件,在64位工作精细。p>
# 2 楼答案
尝试使用
g++
而不是gcc
编译器。诚然,这些通常是别名,但是g++
负责标准库和C和C++之间的ABI差异另外,请注意,JNI本质上是一个C接口,因此您需要
有时
extern "C"
属性是从javah
生成的继承的。h文件我真的不明白为什么标准
jni.h
文件不能定义JNIEXPORT
来包含这个属性