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);
複製代碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章