次のような 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() 経由ではありませんか?
これは正しい動作ですか?