C和C++参数转换的区别
jni c++:cpp后缀名编译 jni c:c后缀名编译
jni中,c++和c语言转换函数基本上一样,但是参数不一样, 参数变化很类似 如下例子 jni c++:env->GetByteArrayElements(buf, 0); 对应 jni c:(*env)->GetByteArrayElements(env, buf, 0) 其余的调用转换函数,参数变化基本类似
jni基本类型
在jni.h找到基本类型的定义 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 */ 以上的这些基本类型不需要用函数转换,直接可以赋值判断等c语言基本类型的操作
参数类型转换
以下以jni c++为例的操作
jstring转char* 传入参数: JNIEnv *env jstring jStr 处理: const char * str = env->GetStringUTFChars(jStr, 0);/*注意一定要const修饰,这里内容不能被修改 */ /*处理信息,不能修改str的数据 */ env->ReleaseStringUTFChars(jStr, str); /*记得释放 */
jbyteArray转char* 传入参数: JNIEnv * env jbyteArray jByteArr 处理: const char *str = env->GetByteArrayElements(jByteArr, 0);/*注意一定要const修饰,这里内容不能被修改 */ int jByteArrLen = env->GetArrayLength(jByteArr); /*数组元素个数 */ /*处理信息,不能修改str的数据 */ env->ReleaseByteArrayElements(jByteArr, str); /*记得释放 */
char*转jstring 传入参数: JNIEnv * env char * str 处理: jstring jstr = env->NewStringUTF(str);
char*转jbyteArray 传入参数: JNIEnv * env char * str 处理: jbyteArray jByteArr = env->NewByteArray(len); /* 申请一块内存区域,不用释放,返回给安卓java层处理内存问题 */ env->SetByteArrayRegion(jByteArr, 0/*在jByteArr中的索引 */, len, str);
返回jbyteArray jbyteArray outArray = NULL; outArray = env->NewByteArray(len); env->SetByteArrayRegion(outArray, 0, len, (signed char*)buf); return outArray;
返回jstring char* returnP = (char*)malloc(strlen(buf) + 1); strcpy(returnP, buf); return env->NewStringUTF(returnP);
|