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_);