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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                先來看動態注冊中的一段代碼: ~~~ tatic JNINativeMethod gMethods[] = { ...... { "processFile" //processFile的簽名信息,這么長的字符串,是什么意思? "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V", (void*)android_media_MediaScanner_processFile }, ...... } ~~~ 上面代碼中的JNINativeMethod已經見過了,不過其中那個很長的字符串"(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V"是什么意思呢? 根據前面的介紹可知,它是Java中對應函數的簽名信息,由參數類型和返回值類型共同組成。不過為什么需要這個簽名信息呢? - **這個問題的答案比較簡單。因為Java支持函數重載,也就是說,可以定義同名但不同參數的函數。但僅僅根據函數名,是沒法找到具體函數的。為了解決這個問題,JNI技術中就使用了參數類型和返回值類型的組合,作為一個函數的簽名信息,有了簽名信息和函數名,就能很順利地找到Java中的函數了。** JNI規范定義的函數簽名信息看起來很別扭,不過習慣就好了。它的格式是: ~~~ (參數1類型標示參數2類型標示...參數n類型標示)返回值類型標示。 ~~~ 來看processFile的例子: ~~~ Java中函數定義為void processFile(String path, String mimeType) 對應的JNI函數簽名就是 (Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V 其中,括號內是參數類型的標示,最右邊是返回值類型的標示,void類型對應的標示是V。 當參數的類型是引用類型時,其格式是”L包名;”,其中包名中的”.”換成”/”。上面例子中的 Ljava/lang/String;表示是一個Java String類型。 ~~~ 函數簽名不僅看起來麻煩,寫起來更麻煩,稍微寫錯一個標點就會導致注冊失敗。所以,在具體編碼時,讀者可以定義字符串宏,這樣改起來也方便。 表2-3是常見的類型標示: :-: 表2-3 類型標示示意表 | 類型標示 | Java類型 | 類型標示 | Java類型| | --- | --- | --- | --- | | Z | boolean | F | float | | B | byte | D | double | | C| char | L/java/langaugeString; | String | | S | short | [I | int[] | | I | int | [L/java/lang/object; | Object[] | | J | long | | | 上面列出了一些常用的類型標示。請讀者注意,如果Java類型是數組,則標示中會有一個“[”,另外,引用類型(除基本類型的數組外)的標示最后都有一個“;”。 再來看一個小例子,如表2-4所示: :-: 表2-4 函數簽名小例子 | 函數簽名 | Java函數 | | --- | --- | | “()Ljava/lang/String;” | String f() | | “(ILjava/lang/Class;)J” | long f(int i, Class c) | | “([B)V” | void f(byte[] bytes) | 請讀者結合表2-3和表2-4左欄的內容寫出對應的Java函數。 雖然函數簽名信息很容易寫錯,但Java提供一個叫javap的工具能幫助生成函數或變量的簽名信息,它的用法如下: ~~~ javap –s -p xxx。 ~~~ 其中xxx為編譯后的class文件,s表示輸出內部數據類型的簽名信息,p表示打印所有函數和成員的簽名信息,而默認只會打印public成員和函數的簽名信息。 有了javap,就不用死記硬背上面的類型標示了。
                  <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>

                              哎呀哎呀视频在线观看