日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android jni 返值

發布時間:2024/4/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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層調用如果這樣寫:

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)。為什么呢?

我在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 返值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。