2017-01-26 17 views
0

は、これは私が文字列のためにそれを行う方法です。getApplicationJniMethodIdでどのようにintをパラメータとして送信できますか?

void SampleSwitchCamera(const char *name) 
{ 
    jboolean isAttached; 
    JNIEnv *env; 
    jmethodID mid; 
    jstring js; 
    LOGE("SampleSwitchCamera Begin"); 
    env = getJniEnv(&isAttached); 
    if (env == NULL) 
      goto FAIL0; 

    mid = getApplicationJniMethodId(env, applicationJniObj, "cameraSwitchCallback", "(Ljava/lang/String;)V"); 
    if (mid == NULL) 
      goto FAIL1; 

    js = (*env)->NewStringUTF(env, name); 
    (*env)->CallVoidMethod(env, applicationJniObj, mid, js); 

    if (isAttached) 
    { 
     (*global_vm)->DetachCurrentThread(global_vm); 
    } 
    LOGE("SampleSwitchCamera End"); 
    return; 
FAIL1: 
    if (isAttached) 
    { 
     (*global_vm)->DetachCurrentThread(global_vm); 
    } 
FAIL0: 
    LOGE("SampleSwitchCamera FAILED"); 
    return; 
} 

だから私はこのように試してみました:

void CallbackFromJni(const int *id) 
{ 
jboolean isAttached; 
JNIEnv *env; 
jmethodID mid; 
jstring js; 
LOGE("callbackFromJni Begin %d", id); 
env = getJniEnv(&isAttached); 
if (env == NULL) 
    goto FAIL0; 

mid = getApplicationJniMethodId(env, applicationJniObj, "callbackFromJni", "(Ljava/lang/Integer;)V"); 
if (mid == NULL) 
    goto FAIL1; 

jintArray array = (*env)->NewIntArray(env, id); 
(*env)->CallVoidMethod(env, applicationJniObj, mid, array); 

if (isAttached) 
{ 
    (*global_vm)->DetachCurrentThread(global_vm); 
} 
LOGE("callbackFromJni End"); 
return; 
FAIL1: 
if (isAttached) 
{ 
    (*global_vm)->DetachCurrentThread(global_vm); 
} 
FAIL0: 
LOGE("callbackFromJni FAILED"); 
return; 
} 

しかし、私はこのエラーを取得する:

01-26 11:17:36.654: E/VidyoMobile app/src/main/jni/ndkVidyoSample.c(22071): callbackFromJni Begin 101 
01-26 11:17:36.655: E/art(22071): JNI ERROR (app bug): attempt to pass an instance of int[] as argument 1 to void com.vidyo.vidyocore.VidyoCoreApplication.callbackFromJni(java.lang.Integer) 
01-26 11:17:36.692: A/art(22071): art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: bad arguments passed to void com.vidyo.vidyocore.VidyoCoreApplication.callbackFromJni(java.lang.Integer) (see above for details) 
01-26 11:17:36.692: A/art(22071): art/runtime/java_vm_ext.cc:410] native: #09 pc 000024a9 /data/app/be.belfius.videocall-1/lib/arm/libndkVidyoSample.so (CallbackFromJni+104) 
01-26 11:17:37.219: A/art(22071): art/runtime/runtime.cc:366] native: #12 pc 000024a9 /data/app/be.belfius.videocall-1/lib/arm/libndkVidyoSample.so (CallbackFromJni+104) 
01-26 11:17:37.220: A/art(22071): art/runtime/runtime.cc:366] native: #14 pc 000024a9 /data/app/be.belfius.videocall-1/lib/arm/libndkVidyoSample.so (CallbackFromJni+104) 
01-26 11:17:37.365: A/DEBUG(195): Abort message: 'art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: bad arguments passed to void com.vidyo.vidyocore.VidyoCoreApplication.callbackFromJni(java.lang.Integer) (see above for details)' 
01-26 11:17:37.389: A/DEBUG(195):  #14 pc 000024a9 /data/app/be.belfius.videocall-1/lib/arm/libndkVidyoSample.so (CallbackFromJni+104) 

私は私が必要とする原因をasummingていますこれはintArrayを作成しています。何newIntがないので、どのように私は、int型を作成することができ、ちょうどnewIntArray

答えて

1

あなたは

半ば= getApplicationJniMethodId(ENV、applicationJniObj、 "callbackFromJni"、「(

パラメータとして Integerオブジェクトを取得するメソッドを取得すると宣言しました Ljava/lang /整数;)V ");

が、その後、あなたがint[]

パラメータとして
jintArray array = (*env)->NewIntArray(env, id); 
(*env)->CallVoidMethod(env, applicationJniObj, mid, array); 

使用するタイプを宣言する正しい方法を整数テーブルを渡しているが、ここで説明されている:https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html


あなたは、パラメータとしてIntegerを渡したい場合は、単一のIntegerオブジェクトを作成するためにテーブルを作成する必要があります

jclass int_cls = (*env)->FindClass(env, "java/lang/Integer"); 
if (int_cls == NULL) 
    goto FAIL1; 

jmethodID int_constructor = (*env)->GetMethodID(env, int_cls, "<init>", "(I)V"); 
if (int_constructor == NULL) 
    goto FAIL1; 

jobject java_int = (*env)->NewObject(env, int_cls, int_constructor, (jint)*id); 
if (java_int == NULL) 
    goto FAIL1; 

(*env)->CallVoidMethod(env, applicationJniObj, mid, java_int); 

この場合、Java側での方法は次のようになりする必要があります。代わりに整数の

native void callbackFromJni(Integer result); 

プリミティブ型を直接渡すことができるように、簡単なintではなくIntegerを渡すために、多くの方が簡単です代わりに、この場合、Java側での方法

mid = getApplicationJniMethodId(env, applicationJniObj, "callbackFromJni", "(I)V"); 
if (mid == NULL) 
    goto FAIL1; 

(*env)->CallVoidMethod(env, applicationJniObj, mid, *id); 

オブジェクトでそれらをボクシングのように見える必要があります:

native void callbackFromJni(int result); 

あなたは整数配列を渡ししようとしていた場合int[]あなたは

mid = getApplicationJniMethodId(env, applicationJniObj, "callbackFromJni", "([I)V"); 

新しいテーブルを作成するに渡されたパラメータはサイズではなく、配列そのものであるので、あなたが希望を宣言する必要があります最初にその配列のサイズを取得し、テーブルを作成するときに使用する必要があります。

jintArray array = (*env)->NewIntArray(env, size); 

は、配列の内容を設定し、この場合、Java側で

(*env)->SetIntArrayRegion(env, array, 0, size, id); 
(*env)->CallVoidMethod(env, applicationJniObj, mid, array); 

メソッドをコールバックするためにそれを渡すように見える必要があります。

native void callbackFromJni(int[] result); 
+0

非常にうまく入れる:Dを、おかげで多くのことを。私はcallVoidMethod経由で送信するjava_intを作成する方法を理解していませんでしたが、あなたの説明は完璧で、私の問題を修正するために管理しました –

+0

オブジェクトを作成するには、宛先クラス参照とコンストラクタ参照が必要です'NewObject(env、clazz_ref、constructor_ref、constructor_params ...)' –

+0

私はIntArrayとStringを例にとっていましたが、newStringUTFを使って文字列を作成することができます。Integerは何か類似していて、 tクラス参照を送信する方法がわからない –

関連する問題