如何使用getApplicationJniMethodId将int作为参数发送
How can I send a int as a parameter with getApplicationJniMethodId?
这就是我对String:的处理方式
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)
我正在填充,因为我需要一个int,而这是在创建一个intArray。我如何创建int,因为没有newInt,只有newIntArray
您声明获取方法,该方法将Integer
对象作为参数
mid=getApplicationJniMethodId(env,applicationJniObj,"callbackFromJni","(Ljava/lang/Integer;)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
要容易得多,因为可以直接传递基元类型,而不是在对象中装箱
mid = getApplicationJniMethodId(env, applicationJniObj, "callbackFromJni", "(I)V");
if (mid == NULL)
goto FAIL1;
(*env)->CallVoidMethod(env, applicationJniObj, mid, *id);
在这种情况下,Java端的方法需要看起来像:
native void callbackFromJni(int result);
如果您试图传递整数数组int[]
,则需要声明
mid = getApplicationJniMethodId(env, applicationJniObj, "callbackFromJni", "([I)V");
传递给创建新表的参数是数组的大小,而不是数组本身,所以您需要首先获取该数组的大小并在创建表时使用它
jintArray array = (*env)->NewIntArray(env, size);
然后设置数组内容并将其传递给回调
(*env)->SetIntArrayRegion(env, array, 0, size, id);
(*env)->CallVoidMethod(env, applicationJniObj, mid, array);
在这种情况下,Java端的方法需要看起来像:
native void callbackFromJni(int[] result);
相关文章:
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- int() 导致参数覆盖
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- <string> 如何在使用 SWIG 时将 int 数组和 List 作为参数传递给 C# C++
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 'int a'声明隐藏参数
- 为什么 std::error_code 构造函数的第一个参数固定为 int
- 命令行参数在不到 3 个 LOC 中 int?
- C++如何将变量传递给带有无符号 int & 的参数uint16_t函数?
- 错误:类型为"bar&"的参数的默认参数<int>具有类型"bar<int>"
- 无法将参数'int'转换为'char &'
- 向量作为函数的参数(int**)
- 在 SGI STL 的实现中,文件 stl_alloc.h 中模板参数"int inst"的功能是什么?
- 维护一个有序的(通过参数int)集合