天天看點

Android ndk 字元串傳參

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-&gt;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