JNI系列入門之Hello JNI C(二)

JNI系列文章:java

  1. JNI系列之入門Hello JNI C(一)
  2. JNI系列之入門Hello JNI C(二)
  3. JNI系列入門之C語言與Java的雙向通訊(一)
  4. JNI系列入門之C語言與Java的雙向通訊(二)
  5. JNI系列入門之C語言中文字符串亂碼問題

引言

即上一篇JNI系列之入門Hello JNI C(一)簡單介紹後,這篇將詳細講解C中的全部代碼。c++


  • 理解C中native函數實現的意思 咱們來看生成出來的native函數聲明
/* * Class: com_jerry_jnitest_JniTest * Method: getStringFromC * Signature: ()Ljava/lang/String; */
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringFromC (JNIEnv *, jclass);
複製代碼
  1. Java_com_jerry_jnitest_JniTest_getStringFromC這一長串是函數名,它是有規律的: Java_native方法在java類中的包名全稱_native的方法名 原來java裏native方法:
public native static String getStringFromC();
複製代碼
  1. 再來看返回值 jstring,對應的是java中native方法的返回值String,經過VS右擊它轉到定義,會發現它就是一個_jobject結構體指針變量jobject的別名:
    Paste_Image.png
  2. 參數JNIEnv *,它在java的native方法裏沒有對應的參數,這個是JNI接口函數特有的,包括後面的jclass或者jobject是必須有的兩個參數。 JNIEnv *是個啥玩意呢,經過VS轉到定義:
    Paste_Image.png
    有兩個地方都聲明瞭: 一個是C++的,一個是C的。 C中是結構體指針struct JNINativeInterface_ *的一個別名,那就說明JNIEnv *就是一個二級指針類型。 C++中:
    Paste_Image.png
    圖中能夠看到JNIEnv是JNIEnv_的一個別名,而JNIEnv_是個結構體,裏面JNINativeInterface_ *function做爲它的一個成員變量,圖中能夠看到C++對function的函數封裝了一層,參數傳了this,也就是當前functions這個結構體指針其實就是上文C中JNIEnv這個JNINativeInterface_ *結構體指針的別名。那意思就很明白了,在c++中native函數的JNIEnv *就是一級指針。 至於C中爲何要用二級指針,應該是結構體中的那些函數指針的具體實現都須要用到JNINativeInterface_ *這個結構體指針吧。(這段話比較拗口,會比較難理解,能夠多看看思考思考) native函數中,第二個參數jclass,看看它的定義:
    Paste_Image.png
    其實它的意思就是相對於java的Class類型,由於咱們在Java中寫的native方法是 static修飾的因此直接是類類型來訪問應用這個native方法。 若是java中改爲:
public native String getStringOfC(String input);
複製代碼

那就變成了:數組

JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringOfC (JNIEnv *env, jobject jobj, jstring jstr){

    }
複製代碼

這裏面jobject標示這個native方法是調用它的對象,第三個參數jstring就是java方法中String input這個參數。 從上文能夠看出,jxxxx的都會對應Java中的一種數據類型。函數

下面是Java的數據類型與JNI的數據類型的映射關係:post

Java數據類型 Jni數據類型 C數據類型
基礎數據類型
void void void
boolean jboolean unsigned char
byte jbyte signed char
char jchar char
short jshort short
int jint int
long jlong __int64(long long)
float jfloat float
double jdouble double
引用數據類型
String jstring (jobject的別名) struct _jobject*
Object jobject struct _jobject*
基本數據類型的數組
blooean[] jbooleanArray
1. jbooleanArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
byte[] jbyteArray
1. jbyteArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
char[] jcharArray
1. jcharArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
short[] jshortArray
1. jshortArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
int[] jintArray
1. jintArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
long[] jlongArray
1. jlongArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
float[] jfloatArray
1. jfloatArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
double[] jdoubleArray
1. jdoubleArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *
引用數據類型數組
Object[] jobjectArray
1. jobjectArray是jarray的別名
2. jarray又是jobject的別名
struct _jobject *

JNI系列文章:this

  1. JNI系列之入門Hello JNI C(一)
  2. JNI系列之入門Hello JNI C(二)
  3. JNI系列入門之C語言與Java的雙向通訊(一)
  4. JNI系列入門之C語言與Java的雙向通訊(二)
  5. JNI系列入門之C語言中文字符串亂碼問題
相關文章
相關標籤/搜索