ndk開發的過程中,Android(Java)與JNI(C/C++)之間,由于參數類型無法互通,是以在傳參的過程中,會遇到不少的麻煩。
其中我感覺最麻煩的要數字元串類型的傳參
從JAVA傳字元串到C++
上層JAVA資料類型String對應NDK為jstring類型,上層傳參的方式和普通的java函數間調用并沒有什麼差別,重點是底層函數,如何将上層傳來的jstring轉化成本地可認并且可以操作的char *數組
例子如下(函數封裝,可由實際函數調用。傳回的char *數組一定要在外部記得釋放,否則會造成記憶體洩漏):
主題思想:先将String轉化成JAVA的字元串數組(對應java描述為<code>byte[]</code>),再對byte進行字元串複制操作。
方法:
1、定位JAVA的String類
2、找到String類下面的函數getBytes
3、調用getBytes将字元串轉化成jbyte
4、進行字元串複制操作
5、釋放相關資源
從C++傳字元串到java
從C++傳字元串到java又分為兩種形式
1、通過result傳回值的方式
這種方式其實在使用的時候比較簡單,如下即可:
2、通過回調的方式向JAVA傳字元串
這種傳值的方式就比較麻煩。回調的方法此處不談,僅聊參數的傳遞
執行個體如下:
重點:其實回調的方式和普通函數的回調類似,重點在于env->GetMethodID這個函數的第三個參數寫法。其中括号内代表參數,多個可以直接連續寫下去。括号外代表傳回值
( arg-types ) ret-type
開發過程中遇到的JAVA類型辨別清單
辨別
類型
舉例
J
long
-----
Z
boolean
----
B
byte
C
char
S
short
-------
I
int
F
float
D
double
------
Lclassname;
specify class
Ljava/lang/String;
[type
type[]
本文第一段代碼:[B