簡體   English   中英

使用本機接口的java.lang.UnsatisfiedLinkError

[英]java.lang.UnsatisfiedLinkError using native interface

我有這個cpp文件:

//pkgnative_tries__native_NativeSystem.cpp
#include <pkgnative_tries__native_NativeSystem.h>
#include<iostream>
using namespace std;

extern "C"
JNIEXPORT void JNICALL Java_pkgnative_tries__1native_NativeSystem_println
  (JNIEnv *env, jobject obj, jstring javaString)
{
    //Get the native string from javaString
    const char *nativeString = env->GetStringUTFChars(javaString, 0);
    cout << nativeString;

    env->ReleaseStringUTFChars(javaString, nativeString);
}

pkgnative_tries__native_NativeSystem.h:

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

#ifndef _Included_pkgnative_tries__native_NativeSystem
#define _Included_pkgnative_tries__native_NativeSystem
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     pkgnative_tries__native_NativeSystem
 * Method:    println
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_pkgnative_tries__1native_NativeSystem_println
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

這是java類:

import java.io.File;

public class NativeSystem {
    static {
        try {
            System.load(new File(NativeSystem.class.getResource("native_files/pkgnative_tries__native_NativeSystem.dll").toURI()).getPath());
        } catch (Exception e) {
            System.err.println("Error");
            e.printStackTrace();
        }
    }
    public static native void println(String obj);
}

當我調用NativeSystem.println("abc"); 表明

Exception in thread "main" java.lang.UnsatisfiedLinkError: NativeSystem.println(Ljava/lang/String;)V
    at NativeSystem.println(Native Method)
    at NativeTries.main(NativeTries.java:19)
Java Result: 1

有人知道為什么嗎? 我確定dll已加載, NativeSystemstatic塊中的catch塊未執行。 我以前從未遇到過。 我該如何解決?

C ++確實會處理DLL中的函數名稱,如果您在Windows上,則可以使用dumpbin來查看dll中的函數名稱。

在您的情況下,“ native_files / pkgnative_tries__native_NativeSystem.dll”行看起來很亂,請檢查一下。

我通過添加解決了相同類型的問題

System.loadLibrary("your library name");

對於需要它們的每種方法,還請驗證的路徑是否正確。

請參考此以獲取更多信息。 本機方法中的UnsatisfiedLinkError

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM