7

他の方法では簡単な作業のように思われる問題があります。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オブジェクトです。

これで助けていただければ幸いです。

ありがとう

4

1 に答える 1

17

AjmethodIDはオブジェクトではありません。に変換する必要はありませんGlobalRef。同上jfieldID

于 2012-06-14T10:20:16.163 に答える