C ++ / Java JNI得到异常unsastisfiedLinkError

时间:2015-11-03 20:45:12

标签: java c++ java-native-interface

尝试创建一个简单的JNI程序,但总是得到异常: 线程“main”中的异常java.lang.UnsatisfiedLinkError: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 TEst\n");
    //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

1 个答案:

答案 0 :(得分:0)

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

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