前言
我們?cè)?c或.cpp中實(shí)現(xiàn)本地方法時(shí),我們不僅要關(guān)注方法之間的對(duì)應(yīng)關(guān)系(即靜態(tài)注冊(cè)于動(dòng)態(tài)注冊(cè))弦追,也要關(guān)注方法入?yún)⒅袛?shù)據(jù)類型的對(duì)應(yīng)關(guān)系毕骡。
舉個(gè)例子,在java文件中聲明本地方法如下
public static native void test(short s, int i, long l, float f, double d, char c,
boolean z, byte b, String str, Object obj, MyClass p, int[] arr);
其在c中的對(duì)應(yīng)實(shí)現(xiàn)如下
JNIEXPORT void JNICALL Java_com_study_jnilearn_HelloWorld_test
(JNIEnv *env, jclass cls, jshort s, jint i, jlong l, jfloat f,
jdouble d, jchar c, jboolean z, jbyte b, jstring j_str, jobject jobj1, jobject job2, jintArray j_int_arr)
{
...
}
可以發(fā)現(xiàn)奏候,int變成了jint,int[]變成了jintArray循集。
基本數(shù)據(jù)類型的對(duì)應(yīng)
引用數(shù)據(jù)類型的對(duì)應(yīng)
jvalue類型
jvalue是一個(gè)unio(聯(lián)合)類型,在C語中為了節(jié)約內(nèi)存蔗草,會(huì)用聯(lián)合類型變量來存儲(chǔ)聲明在聯(lián)合體中的任意類型數(shù)據(jù) 咒彤。在JNI中將基本數(shù)據(jù)類型與引用類型定義在一個(gè)聯(lián)合類型中,表示用jvalue定義的變量咒精,可以存儲(chǔ)任意JNI類型的數(shù)據(jù)镶柱,后面會(huì)介紹jvalue在JNI編程當(dāng)中的應(yīng)用。原型如下
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
更多JNI&NDK系列文章模叙,參見:
JNI&NDK開發(fā)最佳實(shí)踐(一):開篇
JNI&NDK開發(fā)最佳實(shí)踐(二):CMake實(shí)現(xiàn)調(diào)用已有C/C++文件中的本地方法
JNI&NDK開發(fā)最佳實(shí)踐(三):CMake實(shí)現(xiàn)調(diào)用已有so庫(kù)中的本地方法
JNI&NDK開發(fā)最佳實(shí)踐(四):JNI數(shù)據(jù)類型及與Java數(shù)據(jù)類型的映射關(guān)系
JNI&NDK開發(fā)最佳實(shí)踐(五):本地方法的靜態(tài)注冊(cè)與動(dòng)態(tài)注冊(cè)
JNI&NDK開發(fā)最佳實(shí)踐(六):JNI實(shí)現(xiàn)本地方法時(shí)的數(shù)據(jù)類型轉(zhuǎn)換
JNI&NDK開發(fā)最佳實(shí)踐(七):JNI之本地方法與java互調(diào)
JNI&NDK開發(fā)最佳實(shí)踐(八):JNI局部引用歇拆、全局引用和弱全局引用
JNI&NDK開發(fā)最佳實(shí)踐(九):調(diào)試篇