私は、Cとの統合が必要なx86用のAndroidアプリで作業しています。私はswig/JNIを使ってこのトリックを行いました。部。しかし、ポインタは私にいくつかのエラーを与えてきました。CからJavaへのポインタを渡すとNULLになる
私の問題は、エミュレータ(ARM)では変数のアドレスを正常に参照できますが、デバイス(x86)では問題ありません。
this linkの例を使って、このアドレスがJavaに渡されると、Cの割り当て済み変数のアドレスはNULLになることがわかりました。たとえば...
ガブガブ飲む-生成JNI:new_intpを含む
SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1intp(JNIEnv *jenv, jclass jcls) {
jlong jresult = 0 ;
int *result = 0 ;
(void)jenv;
(void)jcls;
result = (int *)new_intp();
LOGI("Result is %x", result);
*(int **)&jresult = result;
LOGI("JResult is %x", jresult);
return jresult;
}
ソースファイル():
static int *new_intp() {
return (int *) calloc(1,sizeof(int));
}
私はアドレスの値をチェックするprint文を持っていますそれはCで始まり、Javaに渡されます。 new_intp()では、新しい変数には見栄えの良いアドレスが割り当てられますが、この値がJNIに戻ってjlongとしてキャストされるとNULLに変わります。言い換えれば
、*(int **)&jresult = result;
原因は0
このエラーが発生する理由であることをjresult? JNIがポインタで動作することを禁止するx86の特殊性はありますか?それとも、エミュレータではなく物理的なデバイスでテストしているからですか?
ありがとうございます。
「これは」と呼ばなければなりませんか?これは、JavaとC++の両方で予約されているキーワードです。 –
Cではそうではありません。それはおそらく、名前を持つ変数を与えることを最善の習慣ではありません。それを編集するつもり。 – digitalmouse12
ああ、申し訳ありませんが、私はあなたの質問のタイトルで混乱しました。これはCかC++の質問ですか、適切にタグを付けることができますか? –