Jni:jbyteArray->char* 及char*->jbyteArray

//調用Android原生log打印功能
#include <android/log.h>
#define LOG_TAG    "jni>>"
#define LOGE(format, ...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, format, ##__VA_ARGS__)
//傳入byte[]輸出byte[]
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_com_mysterycode_myjni_MainActivity_convertByte(JNIEnv *env, jobject thiz, jbyteArray source) {
//------jbyteArray -> char*------
    jbyte *jb = env->GetByteArrayElements(source, JNI_FALSE);
    int chars_len = env->GetArrayLength(source);
    char *chars = new char[chars_len + 1];
    memset(chars, 0, chars_len + 1);
    memcpy(chars, jb, chars_len + 1);
    //末尾補0以終止
    chars[chars_len] = 0;
    env->ReleaseByteArrayElements(source, jb, 0);
    LOGE("cb>>%c", chars[0] + 80);//%c爲站位符,%c->char*,%s->char*
    for(int i=0;i<chars_len;i++){
        chars[i]+=3;
    }

//-------char* -> jbyteArray------
    jbyteArray ja=env->NewByteArray(chars_len);
    jbyte *b=env->GetByteArrayElements(ja,JNI_FALSE);//獲取byte[]地址
    memcpy(b,chars, chars_len);//複製實際內容
    env->SetByteArrayRegion(ja,0,chars_len,b);//**從C向Java提交操作(關鍵)**
    env->ReleaseByteArrayElements(ja, b, 0);//釋放指針,避免內存泄漏

    return ja;
}

 

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