他の方法では簡単な作業のように思われる問題があります。Javaクラス(カスタム)のインスタンスのjobjectArrayを返すネイティブメソッドがあります。私がやっていることは、インスタンス化して返したいクラスのjclassを取得してから、そのコンストラクターのjmethodIDを取得することです。
ネイティブメソッドのシグネチャは次のとおりです。
JNIEXPORT jobjectArray JNICALL
Java_com_mn_rootscape_utils_NativeMethods_getFilesPermissions( JNIEnv* env, jobject thizz, jobjectArray filePathsArray )
名前空間とコンストラクターの署名は次のように定義されています。
const char* kFilePermissionInfoPath = "com/mn/rootscape/utils/FilePermissionInfo";
const char* kFilePermInfoConstructorSig = "(IIIIIJJJLjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V";
jclassとjmethodIDについては、ここに掲載されている手順に従っています。後で使用できるように、グローバル参照を取得しています。私のライブラリにはまだoninitがないことに注意してください。コードは、今のところテスト用です。
問題は、jmethodIDのグローバル参照を取得しようとすると、セグメンテーション違反が発生することです。
これを行うコードは次のとおりです。
jclass filePermInfoCls = (*env)->FindClass(env, kFilePermissionInfoPath);
if(!filePermInfoCls)
{
LOGE("getFilesPermissions: failed to get class reference.");
return NULL;
}
gFilePermInfoClass = (jclass)(*env)->NewGlobalRef(env, filePermInfoCls);
LOGI("got gFilePermInfoClass");
jmethodID filePermInfoClsConstructor = (*env)->GetMethodID(env, gFilePermInfoClass, "<init>", kFilePermInfoConstructorSig1);
if(!filePermInfoClsConstructor)
{
LOGE("getFilesPermissions: failed to get method reference.");
return NULL;
}
gFilePermInfoClsConstructor = (jmethodID)(*env)->NewGlobalRef(env, filePermInfoClsConstructor);
LOGI("got gFilePermInfoClsConstructor");
実際のエラーは次のとおりです。
06-14 09:17:26.648:W / dalvikvm(26012):decodeIndirectRefの無効な間接参照0x4c0bdc40 06-14 09:17:26.648:E / dalvikvm(26012):VMが異常終了
gFilePermInfoClassおよびgFilePermInfoClsConstructorは、グローバル参照を保持するためのグローバルjclassおよびjmethodIDオブジェクトです。
これで助けていただければ幸いです。
ありがとう