Android-JNI之数据类型转换

Android-JNI之数据类型转换

      • JNI实战1-常用数据类型转换

JNI实战1-常用数据类型转换

  1. 基础数据类型
JAVA数据类型 JNI数据类型 C/C++数据类型 大小
boolean jboolean unsigned char 无符号8位
byte jbyte char 有符号8位
char jchar unsigned short 无符号16位
short jshort short 有符号16位
int jint int 有符号32位
long jlong long long 有符号64位
float jfloat float 32位
double jdouble double 64位
  1. 引用数据类型
JAVA数据类型 JNI数据类型
java.lang.Class jclass
java.lang.Throwable jthrowable
java.lang.String Jstring
Other Objects jobjects
java.lang.Object[] jobjectArray
boolean jbooleanArray
byte jbyteArray
char[] jcharArray
short[] jshortArray
int[] jintArray
long[] jlongArray
float[] jfloatArray
double[] jdoubleArray
other arrays Jarray
  1. 引用数据类型之间的转换函数

JAVA -> Native JAVA端 向Native端传递字符串

/*
 * Jstring 转换为char
 */
char *jstringToChar(JNIEnv *env, jstring jstr) {
    char *rtn = NULL;
    jclass clsstring = env->FindClass("java/lang/String");
    jstring strencode = env->NewStringUTF("utf-8");
    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr = (jbyteArray) env->CallObjectMethod (jstr, mid, strencode);
    jsize alen = env->GetArrayLength( barr);
    jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0) {
        rtn = (char *) malloc(alen + 1);
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    env->ReleaseByteArrayElements( barr, ba, 0);
    return rtn;
}

Native-> JAVA Native端 向JAVA端传递字符串

/*
 * char 转换为Jstring
 */
jstring charToJstring(JNIEnv *env, const char *pat) {
    jclass strClass = env->FindClass( "java/lang/String");
    jmethodID ctorID = env->GetMethodID(strClass, "","([BLjava/lang/String;)V");
    jbyteArray bytes = env->NewByteArray(strlen(pat));
    env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte *) pat);
    jstring encoding = env->NewStringUTF("utf-8");
    return (jstring) env->NewObject(strClass, ctorID, bytes, encoding);
}
  1. 数组相关操作

JAVA -> Native JAVA端 向Native 端传递数组

作用:将本地数组指针指向JAVA堆内存的地址
参数 jbyteArray array :从JAVA层传入一个byte据组 byte[] 对应JNI层中的 jbyteArray
参数 jboolean* isCopy :JNI_FALSE ->临时原始数据指针 JNI_TRUE->拷贝原始数据到临时缓冲器的数 据指针 默认值 填0  
返回 jbyte*:数组地址指针
注意:在使用完成JbyteArray之后需要调用下列方法(ReleaseByteArrayElements)进行数组值释放
byte* GetByteArrayElements(jbyteArray array, jboolean* isCopy)
作用:释放被占用的数组
参数 jbyteArray array :占用的数组
参数 jbyte* elems :数组的地址指针
参数 jint mode: 0,将内容释放回来并释放原生数组;
			   JNI_COMMIT:将内容复制回来但不释放原原生数组;
			   JNI_ABORT:释放原生数组但不用将内容复制回来
void ReleaseByteArrayElements(jbyteArray array, jbyte* elems,jint mode)

Native ->JAVA Native端 向JAVA 端传递数组

作用:jbyteArray之间的数组复制功能
参数 jbyteArray array :生成的JAVA端数组
参数 jsize start :复制的数组的起始位置
参数 jsize len :复制数组的大小
参数 jbyte* buf :复制数组的指针地址
void SetByteArrayRegion(jbyteArray array, jsize start, jsize len, const jbyte* buf)

C语言 char 类型数组 转换为 JNI jbyteArray

/*
 1. char -> jbyteArray   转换(C语言数组转换为JAVA-byte数组)
 */
jbyteArray as_byte_array( char* buf, int len,JNIEnv *env) {
    jbyteArray array = env->NewByteArray (len);
    env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
    return array;
}

jbyteArray 转换为 C char 数组

/*
 2. jbyteArray ->  转换(byte 数组 转换为 C语言数组)
 */
unsigned char* as_unsigned_char_array(jbyteArray array,JNIEnv *env) {
    int len = env->GetArrayLength (array);
    unsigned char* buf = new unsigned char[len];
    env->GetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
    return buf;
}

你可能感兴趣的:(Android-JNI,android,c++,java,jni)