JNI Cコードでメソッドを呼び出したクラスの名前を知る方法はありますか?次の文を使ってクラスへの参照を得ることができます:JNI Cメソッドを呼び出すクラスの名前を知ることはできますか?
jclass cls = (*env)->GetObjectClass(env,obj);
しかし、私はクラスの名前を知る方法はありますか? 。
JNI Cコードでメソッドを呼び出したクラスの名前を知る方法はありますか?次の文を使ってクラスへの参照を得ることができます:JNI Cメソッドを呼び出すクラスの名前を知ることはできますか?
jclass cls = (*env)->GetObjectClass(env,obj);
しかし、私はクラスの名前を知る方法はありますか? 。
このコードは、あなたの呼び出し元のクラス名を与えます。これは、できるだけ簡単なコードスニペットです。
代わりにあなたの代わりにGetStringUTFChars/ReleaseStringUTFChars
を使用してのこの操作を行うことができなかった:
// Make sure that the buffer is large enough
char str[128];
jint strlen = env->GetStringUTFLength(strObj);
env->GetStringUTFRegion(strObj, 0, strlen, str);
printf("\nCalling class is: %s\n", str);
文字列がローカルバッファにコピーされるので、リリースする必要があると。
jclass
のgetName()
をJNI経由でも呼び出します。私はエラーをチェックするために、任意の措置を講じていない
jclass cls = env->GetObjectClass(obj);
// First get the class object
jmethodID mid = env->GetMethodID(cls, "getClass", "()Ljava/lang/Class;");
jobject clsObj = env->CallObjectMethod(obj, mid);
// Now get the class object's class descriptor
cls = env->GetObjectClass(clsObj);
// Find the getName() method on the class object
mid = env->GetMethodID(cls, "getName", "()Ljava/lang/String;");
// Call the getName() to get a jstring object back
jstring strObj = (jstring)env->CallObjectMethod(clsObj, mid);
// Now get the c string from the java jstring object
const char* str = env->GetStringUTFChars(strObj, NULL);
// Print the class name
printf("\nCalling class is: %s\n", str);
// Release the memory pinned char array
env->ReleaseStringUTFChars(strObj, str);
注:
あなたは '((* env) - > GetObjectClass(env、obj)) - > getName()'を意味しますか?私はjniのコードからクラス(そのメソッドを呼び出す)の名前を表示したい –
上記の 'jclass-> getName()'を実行するとエラーが発生します –
FYI - 一般的に言うと、何が起こったのか、どんなエラーメッセージなどがあなたの成功を妨げているのか、あなたはより良い助けを得るでしょう。 EJPの反応は正しい。どのようなエラーが発生しているかわからないと、何が動作していないかについてコメントすることはできません。 getName()がjstringを返すことを忘れないでください... –
私の場合、クラスを取得するオブジェクトはありませんでした。代わりに、その署名に基づいて、与えられたクラスの名前を取得したかったのです。
これは私のために働いた。私はそれが助けてくれることを願っています:
// Find the class by its JNI signature
jclass cls = env->FindClass(expectedType);
// Get the class object's class descriptor
jclass clsClazz = env->GetObjectClass(cls);
// Find the getSimpleName() method in the class object
jmethodID methodId = env->GetMethodID(clsClazz, "getSimpleName", "()Ljava/lang/String;");
jstring className = (jstring) env->CallObjectMethod(cls, methodId);
// And finally, don't forget to release the JNI objects after usage!!!!
env->DeleteLocalRef(clsClazz);
env->DeleteLocalRef(cls);
私はstrlenを変数名として使うべきではないと思います。これはそれが既存の標準C関数だからです。 –
私の経験上、「最初にクラスオブジェクトを取得する」の手順は実際には必要ありません。 'clsObj'と' cls'は機能的に同等です。 – shawkinaw
サンプルコードは、現状のままで使用されていると、horrybly local referencesが漏れています。すべてのjobjectおよびjclass参照は削除する必要があります。また、これは悪い習慣です: jclass cls = env-> GetObjectClass(obj); ... cls = env-> GetObjectClass(clsObj); clsに保存されている以前の参照を解放しないでください。 –