Android JNI和NDK學習(06)--JNI的數據類型
本文介紹JNI的數據類型。NDK中關於JNI數據類型的定義都在jni.h中,大家可以參考jni.h。jni.h在ndk中的路徑參考:
android-ndk-r7b/platforms/android-14/arch-arm/usr/include/jni.h
1 基本數據類型
為了使用方便,JNI還提供了以下定義:
#define JNI_FALSE 0 #define JNI_TRUE 1 typedef jint jsize;
2 引用類型
3 數組類型
4 Java虛擬機類型
將JNI注冊到Java時,會首先注冊到Java虛擬機。Java虛擬機的類型如下表:
說明:
(01) L fully-qualified-call;
示例:"Ljava/lang/String;",它在Java虛擬機中表示“Java中的java.lang.String”對應的類型。
注意:fully-qualified-call必須對應完整的java路徑,且用“/”分格。
(02) [ type
示例:"[I",表示int[]類型的數組。
(03) (arg-types) return-type
示例:"(Ljava/lang/String;)I",表示參數是string類型,返回值是int類型。
理解上面這些基本類型之后,我們再來介紹“JNINativeMethod 結構體”。這是JNI編程中非常重要的一個結構體!
5 JNINativeMethod 結構體
5.1 JNINativeMethod定義
typedef struct { const char* name; const char* signature; void* fnPtr; } JNINativeMethod;
name:Java中函數的名字。
signature:Java中函數的參數和返回值。一般的形式是"(arg-types)return-type":arg-types對應是參數類型,空白表示沒有參數;return-type是返回值類型,不能是空白,若返回void,則應該設置return-type為V。
fnPtr:指向native函數的函數名稱。前面都要接 (void *)
5.2 JNINativiMethod的示例
// Java和JNI函數的綁定表 static JNINativeMethod method_table[] = { { "stringFromJni" , "()Ljava/lang/String;" , (void*)stringFromJni }, { "stringToJni" , "(Ljava/lang/String;)V" , (void*)stringToJni }, };
stringFromJni、stringToJni在Java和JNI中的聲明分明如下:
// stringToJni對應在Java中的聲明 private native String stringFromJni(); // stringToJni對應在JNI中的聲明 JNIEXPORT jstring JNICALL stringFromJni(JNIEnv *env, jobject clazz); // stringToJni對應在Java中的聲明 private native void stringToJni(String val); // stringToJni對應在JNI中的聲明 JNIEXPORT void JNICALL stringToJni(JNIEnv *env, jobject clazz, jstring val);
關於JNI類型的更多內容,請參考“jni.h”文件或“JNI完全手冊”。