學JNI之方法簽名遇到的問題

2020-11-13 11:02:34

在學習JNI中尋找方法簽名時遇見的問題

1.when

在學習安卓JNI時,c調java中的方法時用到方法
env->GetMethodID(jclazz,"add1", "(II)I");
這個方法的原型如下
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
具體引數意義可參考文獻,這裡簡單解決一下最後一個引數sig的寫法。
sig是java方法簽名,這個字串如何得到呢?請看下面介紹。

2.how

ndk版本低的可以用一下步驟

  1. 在命令視窗中進入應用的classes/debug/目錄
  2. 執行命令: javap -s 全類名,顯示所有的方法的簽名資訊

這裡我的電腦執行 javap 命令時出現了一個小問題,等下將問題解決方式奉上。(問題一)

ndk版本高的(這裡我也不清楚多高是高,我用的版本是r21b 64位元的)

  1. 定位到 app/build/intermediates/javac/debug/classes目錄下
  2. 在AS中右鍵Show in Explorer
  3. 在目錄中右鍵選中 Open in Terminal(問題二)
  4. 輸入 javap -s 包名.類名 即可(問題三)

3.problem

  1. 上述問題一,是我在執行 javap 命令時系統不識別這個命令,系統給出以下的提示

    ‘javac’ 不是內部或外部命令,也不是可執行的程式 或批次檔

    我懷疑的在目錄下敲出java命令或java -version 卻提示成功。javac 、javap命令全部提示不是內部命令。
    解決方法: 其實這是你設定jdk時的遺留問題,在win10下設定path的jdk路徑時不可以使用相對路徑,必須寫為絕對路徑。而且設定兩個jdk不要在一行上,這個要分開寫,各一行,同時結尾不能帶分號!最好將兩個路徑放在最上位,設定完一定要重新啟動cmd測試javac 、javap命令。如下圖:

在這裡插入圖片描述

  1. 問題二是我的電腦在資料夾裡面點選右鍵沒有在此處開啟命令視窗的選項。
    解決方法:
    1.在桌面新建一個txt檔案,複製以下程式碼。
    2.將檔案儲存修改檔名為XXX.txt 為 OpenCmdHere.reg,儲存完畢雙擊此檔案就ok啦。
 Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere]
@="在此處開啟命令提示字元"
"Icon"="cmd.exe"
 
[HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""
 
[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere]
@="在此處開啟命令視窗"
"Icon"="cmd.exe"
 
[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""
 
[HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere]
@="在此處開啟命令視窗"
"Icon"="cmd.exe"
 
[HKEY_CLASSES_ROOT\Drive\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""
 
[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere]
@="在此處開啟命令視窗"
"Icon"="cmd.exe"
 
[HKEY_CLASSES_ROOT\LibraryFolder\background\shell\OpenCmdHere\command]
@="PowerShell -windowstyle hidden -Command \"Start-Process cmd.exe -ArgumentList '/s,/k, pushd,%V' -Verb RunAs\""
  1. 問題三是剛才測試的cmd中javap命令還能執行,通過AS中開啟的目錄右鍵進入cmd中執行javap命令就不行了,於是我複製了路徑,直接在cd + 複製的目錄 。進入後執行的javap -s 居然成功了,在之後用AS開啟的目錄右鍵進入cmd中執行javap命令就可以了,希望你們沒有這個小問題,要不然重重困難,解決完又深夜了,別指望多學一會兒了。

4.result

在解決完所有的問題後,迴歸主題,在jni中的jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)方法中的sig是代表著方法簽名這個字串的,而這個字串的生成方法通過以上步驟就解決了,具體cmd中的顯示如下圖:
在這裡插入圖片描述
之後就可以找到方法簽名啦!