2

私はこの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がロードされていると確信していcatchますが、ブロック内のstaticブロックNativeSystemは実行されません。私は前にこれに遭遇したことはありません。どうすれば修正できますか?

4

2 に答える 2

1

C++ は DLL 内の関数の名前をマングルします。Windows を使用している場合は、dumpbin を使用して、関数名が dll でどのように見えるかを確認できます。

于 2013-09-16T16:44:30.837 に答える
0

あなたの場合、「native_files/pkgnative_tries__native_NativeSystem.dll」という行が乱雑に見えるので、確認してください。

追加して同じタイプの問題を解決しました

System.loadLibrary("your library name");

それらが必要な各メソッドに、ライブラリのパスが正しいことも確認してください。

詳細については、こちらを参照してください。ネイティブ メソッドの UnsatisfiedLinkError

ありがとう

于 2014-06-18T06:31:45.733 に答える