JNI基本数据类型转换

91 篇文章 10 订阅

/*******************************************************************
 *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 );



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值