2012-02-24 23 views
2

私は012NのでAndroidからC++を呼び出しています。今、私はそのC++関数をJavaからいくつかの機能を必要とし、C++からJavaにコールバックしようとします。私はstackoverflowとネット上の他のソース上の様々なソリューションをチェックしたが、何とかそれを働かせることができなかった。JNI経由でAndroidのC++からJava関数を呼び出す

私は常に次の例外が「W/dalvikvm(358): JNI WARNING: can't call Lcom/main/Main;.message on instance of Lcom/main/Main;

誰も私にこの上の任意のアドバイスを与えることができますか?何かを見逃したり、何かを監督したり、間違ったコードを書いたりしましたか?ここで

は、私はC++から呼び出すJavaの部分である:

public class Main extends Activity 
{ 
    public native String JNIInit(); 

    String message(String text) 
    { text = text + "from java"; 
     return text; 
    } 
    . 
    . 
} 

これは私が成功し、Javaから呼び出すことができますが、私は戻ってJavaへ呼び出すことができないからC++の関数である:

extern "C" JNIEXPORT jstring JNICALL Java_com_main_Main_JNIInit(JNIEnv* env, jobject obj) 
{ jstring jstr = env->NewStringUTF("From jni"); 
    jclass cls = env->FindClass("com/main/Main"); 
    jmethodID method = env->GetMethodID(cls, "message", "(Ljava/lang/String;)Ljava/lang/String;"); 
    jobject result = env->CallObjectMethod(obj, method, jstr); 
    return env->NewStringUTF(str); 
} 

PS:このトピックにはいくつかのスレッドがありますが、とにかくそれを動作させることはできませんでした。私が見逃しているものがなければなりません。私はそれが何であるか把握できません。

+0

お持ちのメソッドシグネチャが正しいかどうかを確認しましたか?クラスにjavapを実行して、正しいかどうかを確認することができます。 – Pavan

+0

OK、私はそれが正しいことを確認しました。 – Pavan

答えて

2

FindClassを使用する代わりに、 "(* env) - > GetObjectClass(env、obj);"

+1

それはそうしました。これは私を夢中にさせていました。どうもありがとうございました。 – HardCoder

+0

問題はありません。うまくいった:) – Pavan

-1

あなたはC++で空の文字列を作成 を使用しても方法からJavaから空の文字列を渡してい

jString pSrc = (*env)->GetString(env,source, 0); 

//ここでソースuは今、Javaメソッド からのuを渡して空の文字列がありますソース

(*env)->String(env, source, pSrc , 0); 

へと最終用途に文字列をコピー

(*env)->ReleaseString(env,source, pSrc , 0); 
+0

私はあなたが質問のポイントを逃したと思う - 彼はクラスへの参照を取得することすらできませんでした。 – Bamerza

関連する問題