1、JNI數據類型
- 以下是在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 |
注意: 引用類型不能直接使用,需要做一些轉換
下面來介紹一下如何實現引用的傳遞。在說明引用傳遞之前,先來普及一個面相對對象語言的概念,個人理解不知是否準確。
- 方法簽名:方法簽名就是用來實現函數重載,不止是函數名還有形參列表也會決定函數的方法簽名,但是返回值除外
- 類簽名:類描述符是類的完整名稱(包名+類名),將原來的 . 分隔符換成 / 分隔符。例如:在java代碼中的java.lang.String類的類描述符就java/lang/String。
數組類型的描述符則爲,則爲: [ + 其類型的域描述符 ,例如:
int [ ] 其描述符爲[I
float [ ] 其描述符爲[F
String [ ] 其描述符爲[Ljava/lang/String;
在編程時候,如果我們使用javah -jni,這些轉換都不需要我們來操作,目前我們使用的是javah,因此這裏只是簡單的介紹,後面會深入的描述這些內容。這裏作爲入門知識,目的是在易懂的情況下,讓新手瞭解更多的知識與概念,之後再深入挖掘。
進入正題,常用引用類型的訪問
- 訪問字符串:
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);
}
- 訪問數組類型
-
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_);