有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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


共 (2) 个答案

  1. # 1 楼答案

    我已经解决了我的问题错误是由于错误的dll文件我是一个64位系统,但gcc创建了一个32位dll,因此dll在运行时无效。然后我用Visual C++编译器生成一个DLL文件,在64位工作精细。p>

  2. # 2 楼答案

    尝试使用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来包含这个属性