java signed byte convert c_NDK Java C 数据类型转换

这次主要学习 NDK 类型转换

java数据类型和JNI底层的C类型进行转换,这个也不难

打开NDK中的jni.h 最前面 定义了C语言的类型宏

#ifdef HAVE_INTTYPES_H

# include /* 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 里面包含了大量的基础函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值