NDK Java C 数据类型转换

</pre>这次主要学习 NDK 类型转换<p></p><p>java数据类型和JNI底层的C类型进行转换,这个也不难</p><p></p><p>打开NDK中的jni.h 最前面 定义了C语言的类型宏</p><p></p><pre class="cpp" name="code">#ifdef HAVE_INTTYPES_H
# 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

意义差不多。

int[] 对应的数组就是jintArray

char[] 对应 jcharArray

Class对应jclass

String 对应jstring

从JNI层返回一个字符串非常简单,第一次学习都会遇到。

(*env)->NewStringUTF(env,"its ok"); //这个方法,直接返回了java string类型。


1. java 字符串转C字符串

c语言里面存储字符串用的是char指针,

也就是jstring 转成 char * 类型

const jchar* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*); 第二个参数是JAVA层的字符串,第三个参数是boolean引用,是否成功

JNIEXPORT jstring JNICALL Java_com_birds_android_ndk_JNI_convert
  (JNIEnv *env, jobject jb, jstring jstr, jint age, jintArray arr) {
    
    jboolean b;
    const char* mychar = (*env)->GetStringUTFChars(env,jstr,&b);
    if (0 != mychar ) {
        //用过后释放,否则可能导致内存泄露
    	(*env)->ReleaseStringUTFChars(env,jstr,mychar);
    	return (*env)->NewStringUTF(env,"its ok copyed.");
    }
	return (*env)->NewStringUTF(env,"its ok.");
}


2.java 数组转C 数组

这个也是一样的道理.

jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
	jboolean b1;
	jint *myarr = (*env)->GetIntArrayElements(env,arr,&b1);
	if (0 != myarr) {
		(*env)->ReleaseIntArrayElements(env,arr,myarr,0);//最后一个参数0表示释放myarr内存.1表示不释放内存但复制内容.
		return (*env)->NewStringUTF(env,"int array copyed.");
	}
上面是指针的做法。

 

void (*GetIntArrayRegion)(JNIEnv*, jintArray, jsize, jsize, jint*); 这个也可以获取JAVA传入的整形数组,2个整形参数依次是数组起点和offset

其他类型与上面的做法类似.

例如:

jintArray     (*NewIntArray)(JNIEnv*, jsize);  这个函数是创建一个指定大小jint数组.


JNI.h 里面包含了大量的基础函数。






你可能感兴趣的:(android,网络,NDK)