Android studio 3.4 使用JIN(JNI數據類型以及參數傳遞)

1、JNI數據類型

  1. 以下是在Jni.h中定義的數據,這些是簡單的數據類型 ,基本數據類型在Native層直接可以使用;
	 #include <inttypes.h>      /* C99 */
	typedef uint8_t         jboolean;       /* unsigned 8 bits */
	typedef int8_t          jbyte;          /* signed 8 bits */
	typedef uint16_t        jchar;          /* unsigned 16 bits */
	typedef int16_t         jshort;         /* signed 16 bits */
	typedef int32_t         jint;           /* signed 32 bits */
	typedef int64_t         jlong;          /* signed 64 bits */
	typedef float           jfloat;         /* 32-bit IEEE 754 */
	typedef double          jdouble;        /* 64-bit IEEE 754 */
	#else
	typedef unsigned char   jboolean;       /* unsigned 8 bits */
	typedef signed char     jbyte;          /* signed 8 bits */
	typedef unsigned short  jchar;          /* unsigned 16 bits */
	typedef short           jshort;         /* signed 16 bits */
	typedef int             jint;           /* signed 32 bits */
	typedef long long       jlong;          /* signed 64 bits */
	typedef float           jfloat;         /* 32-bit IEEE 754 */
	typedef double          jdouble;        /* 64-bit IEEE 754 */
#endif

2 . 引用數據類型:

java jni 描述
Object jobject java基類(任何java對象繼承於此類)
Class jclass ciass對象
String jstring 字符串對象
Object[] jobjectArray 任何對象數組
boolean[] jbooleanArray 布爾型數組
byte[] jbyteArray 比特型數組
char[] jcharArray char數組
short[] jshortArray 短整型數組
int[] jintArray int數組
long[] jlongArray long數組
float[] jfloatArray 浮點數組
double[] jdoubleArray 雙精度
void void

注意: 引用類型不能直接使用,需要做一些轉換
下面來介紹一下如何實現引用的傳遞。在說明引用傳遞之前,先來普及一個面相對對象語言的概念,個人理解不知是否準確。

  1. 方法簽名:方法簽名就是用來實現函數重載,不止是函數名還有形參列表也會決定函數的方法簽名,但是返回值除外
  2. 類簽名:類描述符是類的完整名稱(包名+類名),將原來的 . 分隔符換成 / 分隔符。例如:在java代碼中的java.lang.String類的類描述符就java/lang/String。
    數組類型的描述符則爲,則爲: [ + 其類型的域描述符 ,例如:
    int [ ] 其描述符爲[I
    float [ ] 其描述符爲[F
    String [ ] 其描述符爲[Ljava/lang/String;
    在編程時候,如果我們使用javah -jni,這些轉換都不需要我們來操作,目前我們使用的是javah,因此這裏只是簡單的介紹,後面會深入的描述這些內容。這裏作爲入門知識,目的是在易懂的情況下,讓新手瞭解更多的知識與概念,之後再深入挖掘。

進入正題,常用引用類型的訪問

  1. 訪問字符串:
JNIEXPORT jstring JNICALL Java_com_example_lu_myapplication_JNITest_open_1serial
  (JNIEnv * env, jobject ii,jstring serial)
 {
     char buf[128];
    const jbyte *str;
    //調用 GetStringUTFChars,把一個 Unicode 字串轉成 UTF-8 格式字串
    str =  str = env->GetStringUTFChars(dev_ph,NULL);
    if (str == NULL)
    {
        return NULL;
    }
    printf("%s", str);
    (*env)->ReleaseStringUTFChars(env, serial, str);
    scanf("%127s", buf);
    //構造String, 並返回
    return (*env)->NewStringUTF(env, buf);
}
  1. 訪問數組類型
    1. JNIEXPORT jint JNICALL Java_com_example_lu_myapplication_JNITest_write_1serial
        (JNIEnv *env , jobject jj, jintArray buf , jint num)
      {
             LOGD("進入write");
             jint buf_rev[num];
             env->GetIntArrayRegion(buf, 0, num, buf_rev);
             for (int i = 0; i < num; i++) {
               LOGD("%d\n",buf_rev[i]);
           }
           return 0;
      }
      

這種方式是複製數據,還有一種傳遞指針的方法

			intArray = env->GetIntArrayElements(intArray_, NULL);
			    if (intArray == NULL) {
			        return 0;
			    }
			    // 得到數組的長度
			    int length = env->GetArrayLength(intArray_);
			    

對於傳遞參數先寫到這裏,以後繼續擴展!

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