尝试在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
答案 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文件。