JNI UnsatisfiedLinkError:动态链接库(DLL)初始化例程失败

时间:2019-09-26 09:15:44

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

我正在尝试通过JNI从c ++调用一个函数。 我已经按照我在网上找到的说明进行操作,但是仍然出现异常:

  

线程“ main”中的异常java.lang.UnsatisfiedLinkError:\ path \ to \ dll \ remoteAPI.dll:动态链接库(DLL)初始化例程失败

DLL文件的路径正确并且位于该文件中。 我通过IntelliJ中的VMOptions通过以下路径添加了路径: -Djava.library.path = \ path \ to \ dll

那我为什么还得到异常?显然,当DllMain返回值false时,抛出此异常。但是,我这里需要一个还是jni库一个?如果需要实现,我应该放在哪里?

entities_remoteAPI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class entities_remoteAPI */

#ifndef _Included_entities_remoteAPI
#define _Included_entities_remoteAPI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     entities_remoteAPI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_entities_remoteAPI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

entities_remoteAPI.cpp

#include <jni.h>
#include "entities_remoteAPI.h"


JNIEXPORT void JNICALL Java_entities_remoteAPI_sayHello
  (JNIEnv* env, jobject thisObject) {

}

App.java

public class App 
{
    public static void main( String[] args ) {
        System.out.println( "Hello World!" );

        System.loadLibrary("remoteAPI");

        RemoteAPI ai = new RemoteAPI();
        ai.sayHello();
    }
}

entities / RemoteAPI.java

package entities;

public class RemoteAPI {
    public native void sayHello();
}

1 个答案:

答案 0 :(得分:0)

我现在通过从命令行编译dll而不是使用IDE Code :: Blocks 摆脱了异常。 我在哪里使用的命令

  

g ++ -c -I -I%JAVA_HOME%\ include -I%JAVA_HOME%\ include \ win32实体_RemoteAPI.cpp -o实体_RemoteAPI.o

  

g ++ -shared -o remoteAPI.dll实体_RemoteAPI.o -Wl,-add-stdcall别名

显然,它与构建DLL时通过Code :: Blocks选项有关。