今天,简单讲讲如何在jni内把结果返回给java端。
一。使用Integer类作为返回值参数传入jni。
最近在开发jni时,需要返回多个参数给java。这个过程中,碰到了一些问题,值得探讨一下。
jni_do_something(JNIEnv *env, jobject thiz, jobject p1, jobject p2)
{
jclass c;
jfieldID id;
c = env->FindClass("java/lang/Integer");
if (c==NULL)
{
LOGD("FindClass failed");
return -1;
}
id = env->GetFieldID(c, "value", "I");
if (id==NULL)
{
LOGD("GetFiledID failed");
return -1;
}
env->SetIntField(p1, id, 5);
env->SetIntField(p2, id, 10);
return 0;
}
java层调用如果这样写:
native int do_something(Integer p1, Integer p2);
Integer p1=0, p2=0;
do_something(p1, p2);
Log.d("test", "p1: "+p1);
Log.d("test", "p2: "+p2);
这样打印出的值是(10,10),而不是期望的(5,10)。为什么呢?
Integer p1=0, p2=1;
或者:
Integer p1 = new Integer(0);Integer p2 = new Integer(0);
原来,这跟autoboxing有关。当你用Integer p1 = 0这种方式时,java使用autoboxing机制将0封装在一个Integer对象中,这时使用了Integer类的valueOf方法。在java 语言中,有一个很诡异的现象,对于在-128~127间的小数字,会在static pool中返回一个静态对象,在这个范围外的,会new一个Integer。
二.使用int数组作为返回值传入jni。
JNIEXPORT jint JNICALL Java_com_p2p_h265_1api_HWH265_1GetWidth_1APIs_h264ParseSequenceParameterSet (JNIEnv *env, jclass, jbyteArray pdata, jint nSps, jintArray out_4para, jint nsps_buf_offset){
其中out_4para是java端传入的新建的长度为2的数组。
int * para_size = (int*) (env)->GetIntArrayElements(out_4para, 0);
para_size[0] = params.pic_width; para_size[1] = params.pic_height;
(env)->ReleaseIntArrayElements(out_4para, para_size, 0);
这样,java端就收到了jni传递的值。
android jni 返值就讲完了。
就这么简单。
本文介绍在JNI中如何从C/C++代码返回多个参数到Java端的方法。一种方式是通过Integer对象,利用SetIntField方法修改其值;另一种是通过int数组传递。文中详细解释了这两种方法的具体实现及注意事项。
273

被折叠的 条评论
为什么被折叠?



