<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                學習一門新的編程語言,數據類型是最基本的東西,這里我們講述下jni中的數據類型。 在JNI中把數據類型分為3類: primitive type:int float char reference type:class instances arrays string type 在上一篇HelloWorld中我們打印出HelloWorld等字樣,我們沒有傳入任何參數,這里先給出一個例子,我們在java端傳入字符串,然后看在jni中時如何做處理的。 這個例子跟之前的Helloworld差不多,稍作修改,我們在java端傳入參數, 新建一個類,專門用來封轉jni的method: ~~~ package com.android.jni; public class Prompt { public native String getLine(String prompt); static { System.loadLibrary("MyJNI"); } } ~~~ 在主activity中調用: ~~~ //調用原生函數得到字符串str Prompt pmt = new Prompt(); String str=pmt.getLine("Put in a line!"); //吐出message Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show(); ~~~ 我們調用了Prompt中的getLine方法。 然后看下C中的代碼: ~~~ jstring Java_com_android_jni_Prompt_getLine(JNIEnv* env,jobject jobj,jstring prompt) { char buf[128]; const jbyte *str; str = (*env)->GetStringUTFChars(env,prompt,NULL); if(str == NULL) return NULL; __android_log_print(ANDROID_LOG_INFO,"-JNI-","%s",str); (*env)->ReleaseStringUTFChars(env,prompt,str); sprintf(buf,"From C + %s",str); return (*env)->NewStringUTF(env,buf); } ~~~ getLine函數呼叫了JNI的功能函數GetStringUFTChars來讀取我們傳入的prompt字符串(java端)。GetStringUFTChars函數進入JNIEnv 結構指針,把java中的UTF-8字符類型轉變成C中的Unicode sequence,轉換成jstring 參考來使用。 最后在釋放str的時候不要忘記檢查str是否為空,因為GetStringUFTChars函數可能會調用失敗(outofmenory)。 當原生代碼把傳進來的UTF-8類型字符串之后應該立即釋放內存調用ReleaseStringUTFChars。 調用NewStringUTF函數來構建新的字符串return給java代碼。 在模擬器中運行,當我們點擊按鈕的時候會出現字符串,“From C + 。。。” ![](https://box.kancloud.cn/2016-08-03_57a197f80697f.gif) 調用成功。 --------------------------------------------------------------------------------- 下面我們來進入數組,先看下面的數組定義: int[] iarr; float[] farr; Object oarr; int[][] arr2; iarr和farr是數據數組,但是oarr和arr2是對象數組。 下面舉個例子進入數據數組: 先看下我們要實現的,在java代碼中: ~~~ //調用原生函數得到字符串str //Prompt pmt = new Prompt(); //String str=pmt.getLine("Put in a line!"); int arr[] = new int[10]; for(int i=0;i<10;i++) arr[i]=i; int sum = IntArray.sumArray(arr); //吐出message Toast.makeText(mContext, "sum = "+sum, Toast.LENGTH_SHORT).show(); ~~~ 封裝動態庫function: ~~~ package com.android.jni; public class IntArray { public native static int sumArray(int[] arr); static { System.loadLibrary("IntArray"); } } ~~~ 定義一個數組,然后調用jni中的function來對數組進行操作,這邊在java代碼中傳進去的是一個整形的數組。 ----------------------------------------------------------------------------------------------- 我們來看下在jni中是如何處理的: ~~~ jint Java_com_android_jni_Native_sumArray(JNIEnv* env,jobject jobj,jintArray arr) { jint buf[10]; jint i, sum = 0; (*env)->GetIntArrayRegion(env,arr,0,10,buf); for(i=0;i<10;i++) sum += buf[i]; return sum; } ~~~ 這里調用了GetIntArrayRegion函數來把傳進來的arr數組中的數據都拷貝進C,該函數第三個參數是索引的開始值,第四個參數是被拷貝的數。 JNI也可以使用Get/Release<Type>ArrayElements 函數來使原生代碼直接擁有數組的指針。 ~~~ jint Java_com_android_jni_Native_sumArray(JNIEnv* env,jobject jobj,jintArray arr) { // jint buf[10]; jint *carr; jint i, sum = 0; // (*env)->GetIntArrayRegion(env,arr,0,10,buf); carr = (*env)->GetIntArrayElements(env,arr,NULL); if(carr == NULL) return 0; for(i=0;i<10;i++) sum += carr[i]; (*env)->ReleaseIntArrayElements(env,arr,carr,0); return sum; } ~~~ 運行模擬器: ![](https://box.kancloud.cn/2016-08-03_57a197f822555.gif) ---------------------------------------------------------------------------------------- 下面我們來看下jni中對對象數組的處理。 看下原生函數的聲明 ~~~ public static native int[][] intitInt2DArray(int size); ~~~ 下面是jni中的實現 ~~~ jobjectArray Java_com_android_jni_Native_initInt2DArray(JNIEnv *env, jclass cls,int size) { jobjectArray result; int i; jclass intArrCls = (*env)->FindClass(env, "[I"); if (intArrCls == NULL) { return NULL; /* exception thrown */ } result = (*env)->NewObjectArray(env, size, intArrCls,NULL); if (result == NULL) { return NULL; /* out of memory error thrown */ } for (i = 0; i < size; i++) { jint tmp[256]; /* make sure it is large enough! */ int j; jintArray iarr = (*env)->NewIntArray(env, size); if (iarr == NULL) { return NULL; /* out of memory error thrown */ } for (j = 0; j < size; j++) { tmp[j] = i + j; } (*env)->SetIntArrayRegion(env, iarr, 0, size, tmp); (*env)->SetObjectArrayElement(env, result, i, iarr); (*env)->DeleteLocalRef(env, iarr); } return result; } ~~~ ------------------------------------------------------------------------------------------ ok,我們的基本數據類型就介紹到這,這里數據類型還有很多,大家可以參考user guide,一般我遇到新類型就去翻資料。 下面我們會介紹jni是如何調用java中的成員函數和成員變量的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看