Android アプリケーションを構築しているプロジェクトの C++ 側に取り組んでいます。Java アプリケーションに (JNI 経由で) 渡す必要がある情報が (文字列および文字列配列経由で) いくつかあります。私はこれまでにこれを行ったことがなく、逆方向で作業している人々は C++ の経験がなく、実際には役に立たないことを認めています。
次のコードを見つけました(ここから)
#include <jni.h>
#include "ArrayHandler.h"
JNIEXPORT jobjectArray JNICALL Java_ArrayHandler_returnArray (JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
char *message[5]= {"first","second","third","fourth","fifth"};
ret= (jobjectArray)env->NewObjectArray(5,env->FindClass("java/lang/String"),env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(ret,i,env->NewStringUTF(message[i]));
}
return(ret);
}
しかし、これは私には意味がありません。ほとんどの場合、これをプログラムの C++ 側に組み込む方法がわかりません。これがどのように機能するかを正確に理解できていません。コードは行の実行時にメッセージを送信していますreturn(ret);
か? または for ループ内の行の実行中ですか?
理想的には、新しい関数を組み込む必要がないように、関数の最後ではなく、文字列/文字列配列を「ライブ」で送信したいと考えています。
私が見つけたコードは、私が望むものに対して機能しますか? 私が探しているものは可能ですか?もしそうなら、どうすればいいですか?
編集/更新: JNIと用語を調べるのに1日を費やしたので、ここと@jogabonitoの回答/返信へのコメントの両方で、私が達成しようとしていることを正しく伝えることができなかったと思います.
そうは言っても。私が取り組んでいるコードは、Android アプリケーションが更新をポーリングしないように、メッセージとプレゼンスの更新を (JNI 経由で) Android Java アプリケーションにプッシュする必要がある IM クライアント用です。Javaコードが情報を要求するために呼び出す関数をセットアップする方法を学ぶことができました。ただし、新しいメッセージまたはプレゼンス情報 (jabber スタンザ文字列) が入ってきたときに Java コードにプッシュする方法がわかりません。 Java コード (env、class、methodid など) から情報を取得する必要があります。
関数を呼び出すJavaコードではなく、私のC ++コードである場合、これがどのように可能になるのか、私には意味がありません。説明/ヘルプをいただければ幸いです。
#include <string.h>
#include <stdio.h>
#include <jni.h>
jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj){
jstring jstr = (*env)->NewStringUTF(env, "This comes from jni.");
jclass clazz = (*env)->FindClass(env, "com/inceptix/android/t3d/MainActivity");
jmethodID messageMe = (*env)->GetMethodID(env, clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/String;");
jobject result = (*env)->CallObjectMethod(env, obj, messageMe, jstr);
const char* str = (*env)->GetStringUTFChars(env,(jstring) result, NULL); // should be released but what a heck, it's a tutorial :)
printf("%s\n", str);
return (*env)->NewStringUTF(env, str);
}