【问题标题】:UnsatisfiedLinkError while using JNI使用 JNI 时出现 UnsatisfiedLinkError
【发布时间】: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


【解决方案1】:

尝试使用g++ 而不是gcc 编译器。确实,这些通常是别名,但 g++ 负责标准库以及 CC++ 之间的 ABI 差异很小。

另外,请注意JNI本质上是一个C接口,因此你需要

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

有时,extern "C" 属性继承自 javah 生成的 .h 文件。

我真的不明白为什么标准的jni.h 文件不能定义JNIEXPORT 来包含这个属性。

【讨论】:

  • 我的问题解决了,错误是由于错误的 dll 文件,我的 64 位系统 gcc 创建了 32 位 dll,因此 dll 无效,使用可视 C++ 编译器生成 dll 文件64 位运行良好
【解决方案2】:

我的问题解决了,错误是由于错误的 dll 文件,我的系统是 64 位系统,但 gcc 创建了一个 32 位 dll,因此该 dll 在运行时无效。然后我使用可视化 C++ 编译器生成 64 位的 dll 文件,效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2020-01-25
    相关资源
    最近更新 更多