2012-10-04 4 views

答えて

35

このコードは、あなたの呼び出し元のクラス名を与えます。これは、できるだけ簡単なコードスニペットです。


代わりにあなたの代わりに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); 

文字列がローカルバッファにコピーされるので、リリースする必要があると。

+1

私はstrlenを変数名として使うべきではないと思います。これはそれが既存の標準C関数だからです。 –

+0

私の経験上、「最初にクラスオブジェクトを取得する」の手順は実際には必要ありません。 'clsObj'と' cls'は機能的に同等です。 – shawkinaw

+0

サンプルコードは、現状のままで使用されていると、horrybly local referencesが漏れています。すべてのjobjectおよびjclass参照は削除する必要があります。また、これは悪い習慣です: jclass cls = env-> GetObjectClass(obj); ... cls = env-> GetObjectClass(clsObj); clsに保存されている以前の参照を解放しないでください。 –

-3

jclassgetName()を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); 

注:

+0

あなたは '((* env) - > GetObjectClass(env、obj)) - > getName()'を意味しますか?私はjniのコードからクラス(そのメソッドを呼び出す)の名前を表示したい –

+1

上記の 'jclass-> getName()'を実行するとエラーが発生します –

+2

FYI - 一般的に言うと、何が起こったのか、どんなエラーメッセージなどがあなたの成功を妨げているのか、あなたはより良い助けを得るでしょう。 EJPの反応は正しい。どのようなエラーが発生しているかわからないと、何が動作していないかについてコメントすることはできません。 getName()がjstringを返すことを忘れないでください... –

7

私の場合、クラスを取得するオブジェクトはありませんでした。代わりに、その署名に基づいて、与えられたクラスの名前を取得したかったのです。

これは私のために働いた。私はそれが助けてくれることを願っています:

// 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); 
関連する問題