android jni 返值
生活随笔
收集整理的這篇文章主要介紹了
android jni 返值
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天,簡單講講如何在jni內把結果返回給java端。
一。使用Integer類作為返回值參數傳入jni。
最近在開發jni時,需要返回多個參數給java。這個過程中,碰到了一些問題,值得探討一下。
? 具體是這樣,jni方法jni_do_something作了底層處理后,得出兩個int數據,需要將他們的值傳遞給java。在C語言中,直接用指針就可以了。Java中可以傳遞兩個Integer的引用。用JNI怎么實現呢? 我在android frameworks源代碼中看了一下,對于類似傳值需求,android都是在java層自定義了一個class,用來封裝各個需要傳遞的參數。jni中需要修改時,獲得該class的成員id,然后用SetIntField來修改。我不想這么做,因為類似的native方法比較多,我總不能每次都定義結構體吧,而且將不同方法的參數封裝在一個class中,也不太對,因為它們沒有共同意義。
為了讓jni能修改,Java層毫無疑問需要傳入Integer類型參數,這樣jni才認為它是一個jobject,才可以修改。好的,問題出現了。jni方法實現: 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層調用如果這樣寫:
這樣打印出的值是(10,10),而不是期望的(5,10)。為什么呢?
我在stackoverflow上發了一個貼,大家眾說紛紜。有的說跟mutable/imutable object有關,有的說跟autoboxing有關。 我再次做了試驗。如果寫成 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 返值就講完了。
就這么簡單。
總結
以上是生活随笔為你收集整理的android jni 返值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android LinkedList的基
- 下一篇: android 快速新建字符资源