3

次のような NativeActivity から派生したアクティビティを持つ Android アプリがあります。

public class MyNativeActivity extends android.app.NativeActivity 
{
    public native void TellNativeSide(int info);

    static {
        System.loadLibrary("MyNatAct");  // <--- is this necessary?
    }

    public int OtherMethods(...) ...
}

C/C++ 側では、

extern "C" void  
Java_mycom_nativity_MyNativeActivity_TellNativeSide(JNIEnv *env,
    jobjectactivityobj, jint info)
{
    ... do something
} // java native TellNativeSide() method //

extern "C" jint JNI_OnLoad(JavaVM *vm, void *)
{
    LOGI("***JNI_OnLoad called...");
}

libMyNatAct.so ライブラリは、NativeActivity クラスと実際には android_main() によって自動的に読み込まれ、system.loadLibrary() 行の有無にかかわらず、すべてが正しく実行されます。ただし、JNI_OnLoad() が呼び出されることはなく、TellNativeSide() メソッドも Java 側では使用できません。

system.loadLibrary("MyNatAct");

呼び出しは静的クラスの初期化ブロックにあります。

そのため、ネイティブ .so を 2 回ロードする必要があるようです。init ブロックに入って、すべてのネイティブ メソッドを使用可能にし、JNI_OnLoad() を呼び出します。もう一度、NativeActivity クラスによって、system.loadLibrary() 経由ではありませんか?

これは正しい動作ですか?

4

1 に答える 1

2

それは正しい。system.loadLibrary()ネイティブ Java メソッドを .so ファイルのエクスポートされた関数にバインドするには、明示的に呼び出す必要があります。

于 2015-04-05T09:58:39.453 に答える