C++/Java JNI收到异常unsastifiedLinkError

C++ / Java JNI got exception unsastisfiedLinkError

本文关键字:异常 unsastifiedLinkError JNI Java C++      更新时间:2023-10-16

试图创建一个简单的JNI程序,但总是出现异常:调用内部方法时,线程"main"java.lang.UnsisfiedLinkError:libLearningAccessJNI.sayHello()J出现异常。

下面是我的java代码的快照:

public class LearningAccessJava
{   
    static 
    {
        System.load("C:/vob/Debug/libLearningAccessJNI.dll");
    }
    // Declare native method
    private native void sayHello();
    // Test Driver
    public static void main(String[] args)
    {   
        try
        {
            LearningAccessJava testJava = new LearningAccessJava();
            testJava.sayHello();
        }
        catch (UnsatisfiedLinkError e)
        {
            // Always get this exception
        }
    }
}

libLearningAccessJNI.dll是我通过编译下面的cpp和h代码创建的dll。这是我的c++LearningAccessJNI.cpp和h文件的快照

#include <jni.h>
#include <iostream>
#include <ostream>
#include <stdio.h>
#include "LearningAccessJava.h"
using namespace std;
JNIEXPORT void JNICALL Java_LearningAccessJava_sayHello(JNIEnv *env, jobject thisObj)
{
    printf("Hello World TEstn");
    //cout << "TEST TEST " << endl;
    return;
}

这是我使用javah创建的LearningAccessJava.h文件。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class LearningAccessJava */
#ifndef _Included_LearningAccessJava
#define _Included_LearningAccessJava
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     LearningAccessJava
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_LearningAccessJava_sayHello
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

您能为我们提供用于编译cpp文件的gcc命令行吗?确保:

  • 使用命令行选项-Wl,--add-stdcall-alias-shared
  • 输出.dll文件的路径实际上是"C:/vob/Debug/libLearningAccessJNI.dll"