基於Android NDK的學習之旅—– Java方法映射到C中的簽名 – Android移動開發技術文章_手機開發 Android移動開發教學課程

 剛接觸JNI 的 兄弟在看一些demo的時候 發現有類似與“([Ljava/lang/String;)V”的東西的時候肯定會很“蛋疼”,完全不懂這是啥東西,怎麼來的,有啥用處?
       今天就講講這個“蛋疼”的東西把,俗稱 方法簽名
 
直接來個Demo 把 :
 
觀察下面四個方法對應的簽名
       public void test(){}              ()V
     
       public void test1(int i){}              (I)V
     
       public int test2(){ return 1;}         ()I
     
       public int test3(int i) { return i;}          (I)I
 
哥們,你發現什麼瞭沒 ? 不錯,簽名是由兩部分組成,"()" 裡面代表的是方法的參數,後面外面的部分代表的是該方法的返回值
 
那這兩部分符號又是怎麼定義的呢 ? 與見分曉,請繼續往下看
 
關於這兩部分的定義其實又有分 基本數據類型 和 引用數據類型
基本數據類型對應關系如表:

其實仔細看看發現就是對應java類型的首字母拉, Boolean 比較特殊, 對應的是 Z , Long 對應J

引用數據類型:比較麻煩點,以“L”開頭,以“;”結束,中間對應的是該類型的路徑
       如:String : Ljava/lang/String;
              Object: Ljava/lang/Object;
       自定義類 Cat  對應  package com.duicky;
              Cat : Lcom/duicky/Cat;
數組表示:  數組表示的時候以“[” 為標志,一個“[”表示一維數組
       如:int [] :[I
              Long[][]  : [[J
              Object[][][] : [[[Ljava/lang/Object;
 
敲瞭這麼多字,累瞭,休息下,在問問,你懂瞭嗎 ?嘎嘎 , 別回頭,下面精彩不容錯過。
     
       前面隻是講 方法簽名 的基礎,來來來,現在看看 更簡單準確的方法。其實 JDK 給我們提供瞭相對應生成簽名的工,我們隻需要直接運行就行瞭。
 
寫一個測試類,有如下方法:
   public void test(){}
 
   public void test1(int i){}
 
   public int test2(){ return 1;}
 
   public int test3(int i) { return i;}
 
   public Cat test4(Cat c){ return new Cat();}
 
   public Object test5(int [] a){ return null;}
 
   public int[][] test5(long [][] b){ return null;}
 
   public void test6(Object[][][] b){}
打開Cmd 命令行,cd 到 生成測試類 的 Class 目錄:

 
Cd 到 相對應的 文件夾

 
輸入命令: javap –s  加上你要查看方法簽名的 類 名
       如: javap –s Test  結果就顯示出我們想要的簽名瞭。、


哈哈,有圖有真相! 這回如果還不懂的話,那我就沒辦法瞭。嘎嘎,開玩笑,有不理解的地方可以留言一起討論。
 
 
 

本文出自 “Duicky” 博客

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *