<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                #### 參考: - 參考網友從國外網站摘抄的[《Java 本地接口規范》](http://blog.csdn.net/zhanghw0917/article/details/7000377) - [百度文庫也早已存在,這里下載觀看](https://wenku.baidu.com/view/af4a81bafd0a79563c1e728f.html?re=view) - 已整理的目錄文檔---[Java本地接口規范](http://116.196.111.149:8080/jni.htm)(京東云服務器) #### JNI 數據類型和數據結構 - 基本數據類型 JNI 基本類型和本地等效類型的對應表格如下: ![jni數據類型](https://box.kancloud.cn/32048626f395c65283c639b3bcc15076_757x465.png =757x465) - 引用類型,JNI 還包含了很對對應于不同Java 對象的引用類型,JNI 引用類型的組織層次如下圖 ![引用類型](https://box.kancloud.cn/505e7865bc78de34a3f08778fe6e48d8_614x338.png =614x338) #### JNI 接口函數命名方式 - 類型簽名 Java 虛擬機的類型簽名如下: ![類型簽名](https://box.kancloud.cn/39df18c288b8530cd1709e8f5caa9c48_663x385.png =663x385) 例如,Java 方法int feet(int n, String s,int [] arr)的類型簽名如下: (ILJava/lang/String;[I)I 圓括號里面為參數,I 表示第一個參數int 型,LJava/lang/String;表示第二個參數為全限定Java.lang.String 類型,[I 表示第三個參數為int 型的數組,圓括號后面為返回值類型,I 表示返回值為int 型。 * 一般函數的JNI 接口函數命名方式 - 一般JNI 接口函數命名如下: Java_包名_類名_方法名。 例如:某工程下com/itheima 包下MainActivity 類的int getIntFromC()方法的C 語言實現函數命名如下: jint Java_com_itheima_MainActivity_getIntFromC(JNIEnv* env,jobject obj) 其中,包名所包含的“/”應全部以下劃線替代,其本地實現的參數和返回值也應轉換為JNI 類型。 - 重載函數的JNI 接口函數命名方式 - 重載函數的JNI 實現在一般函數的JNI 實現之外,還應添加上類型簽名以作為同名函數之間的區別, 其接口函數命名如下:Java_包名_類名_方法名_參數簽名。 例如:某工程下com/itheima 包下MainActivity 類的int getIntFromC(int n, String s,int [] arr)方法的C 語言實現函數命名如下: ~~~ jint Java_com_itheima_MainActivity_getIntFromC_ILJava_lang_String_2_3I (JNIEnv* env, jobject obj, jint n, jstring s, jintarray arr)。 ~~~ JNI 在函數命名時采用名字擾亂方案,以保證所有的Unicode 字符都能轉換為有效的C 函數名,所有的“/”,無論是包名中的還是全限定類名中的,均使用“_”代替,用_0,?,_9 來代替轉義字符,如下: ![轉義字符](https://box.kancloud.cn/d1cf220492b90d4317539d320c0f1846_720x165.png =720x165) #### JNI 函數與API - 設置向導三SetUpActivity3.java 的代碼邏輯如下所示,設置向導三的圖形化界面如2-21 所示。在本文檔中我們所主要需要關心的是C/C++數據類型與JNI 本地類型之間的轉化過程,這個過程某些數據的轉換需要使用JNIEnv 對象的一系列方法來完成。 - 1)jstring 轉換為C 風格字符串 `char* test = (char*)(*env)->GetStringUTFChars(env,jstring,NULL);` 使用完畢后,應調用: `(*env)->ReleaseStringUTFChars(env, jstring, test);`釋放資源。 - 2)C 風格字符串轉換為jstring ~~~ char charStr[50]; jstring jstr; jstr = env -> NewStringUTF(charStr); ~~~ - 3)C 語言中獲取的一段char*的buffer 傳遞給Java 在jni 中new 一個byte 數組,然后使用 `(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer) `操作將buffer 拷貝到數組中。 這種方式主要是針對buffer 中存在“\0”的情況,如果以C 風格字符串的方式讀入,就會損失“\0” 之后的字符。 - 4)數組操作 | JNI 函數 | 功能 | | --- | --- | | GetArrayLength | 返回數組中的元素數 | |NewObjectArray | 創建一個指定長度的原始數據類型數組 | | GetObjectArrayElement | 返回Object 數組的元素 | | SetObjectArrayElement | 設置Object 數組的元素 | | GetObjectArrayRegion | 將原始數據類型數組中的內容拷貝到預先分配好的內存緩存中 | | SetObjectArrayRegion | 設置緩存中數組的值 | | ReleaseObjectArrayRegion | 釋放GetObjectArrayRegion 分配的內存 |、 - 對int,char 等基本數據類型的數組操作,將相關Object 名稱替換為對應基本數據類型名稱即為相關函數。 數組操作的方法選擇基于使用者的需求而定,如果使用者需要在內存中拷貝數組并對其進行操作那么我一般使用GetObjectArrayRegion 和SetObjectArrayRegion 函數,否則一般使用SetObjectArrayElement 和GetObjectArrayElement 函數。
                  <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>

                              哎呀哎呀视频在线观看