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

对于传递参数先写到这里,以后继续扩展!

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