您的位置:首页 > Web前端

JNI基本数据类型转换

2011-10-19 09:59 274 查看
/*******************************************************************

 *char*----->jstring

 *******************************************************************/

jstring c2js( const char* pat)

{

    JNIEnv* env = AndroidRuntime::getJNIEnv();

    jclass strClass = env->FindClass("java/lang/String");

    jmethodID ctorID = env->GetMethodID(strClass, "<init>",

            "([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);

}

/******************************************************************

 *jstring ----->char*

 ********************************************************************/

char* js2c( jstring jstr)

{

    JNIEnv* env = AndroidRuntime::getJNIEnv();

    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;

}

/*****************************************************************

 *wchar_t* ----->jstring

 *******************************************************************/

jstring w2js( wchar_t* str)

{

    JNIEnv* env = AndroidRuntime::getJNIEnv();

    size_t len = wcslen(str);

    jchar* str2 = (jchar*) malloc(sizeof(jchar) * (len + 1));

    int i;

    for (i = 0; i < len; i++)

        str2[i] = str[i];

    str2[len] = 0;

    jstring js = env->NewString(str2, len);

    free(str2);

    return js;

}

/*****************************************************************

 *XWCHAR* ----->jstring

 *******************************************************************/

jstring xw2js( XWCHAR* str)

{

    JNIEnv* env = AndroidRuntime::getJNIEnv();

    size_t len = gg_wcslen(str);

    jchar* str2 = (jchar*) malloc(sizeof(jchar) * (len + 1));

    int i;

    for (i = 0; i < len; i++)

        str2[i] = str[i];

    str2[len] = 0;

    jstring js = env->NewString(str2, len);

    free(str2);

    return js;

}

/******************************************************************

 *jstring----->wchar_t*

 ********************************************************************/

wchar_t* js2w( jstring str)

{

    JNIEnv* env = AndroidRuntime::getJNIEnv();

    int len = env->GetStringLength(str);

    wchar_t *w_buffer = new wchar_t[len];

    memset(w_buffer, 0, len + 1);

    w_buffer[len] = '\0';

    wcsncpy(w_buffer, (wchar_t *) env->GetStringChars(str, 0), len);

    env->ReleaseStringChars(str, (const unsigned short *) w_buffer);

    return w_buffer;

}

/******************************************************************

 *jstring----->XWCHAR*

 ********************************************************************/

XWCHAR* js2xw( jstring str)

{

    JNIEnv* env = AndroidRuntime::getJNIEnv();

    int len = env->GetStringLength(str);

    XWCHAR *w_buffer = new XWCHAR[len + 1];

    memset(w_buffer, 0, (len+1) * 2 );

    const jchar* tmp = env->GetStringChars(str, false);

    memcpy(w_buffer, tmp, len * 2 );

    env->ReleaseStringChars(str, tmp);

    return w_buffer;

}

char* ------------> jbyteArray

   jbyteArray RtnArr = NULL;  //下面一系列操作把btPath转成jbyteArray 返回出去

    RtnArr =env->NewByteArray(strlen(btPath));

    env->SetByteArrayRegion(RtnArr, 0, strlen(btPath), (jbyte*)btPath );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jni buffer encoding null c