JNI中String和char之间的相互转换



最近在学习NDK下的opengl es2.0开发,看过很多demos都是直接用一串字符串把shader代码写死的。并没有用一个单独的shader脚本语言文件。glShaderSource()这个方法需要的shader脚本也是通过一个char** 传入的。

 

而且在NDK下面也没看到有什么方式可以直接调用android工程里面的res资源文件。(目前是没发现才刚开始学)

 

所以我就想把shader脚本文件放在android工程的res资源目录里面,在java端读出来然后传入到jni里面去。

 

 

在java中由于是unicode编码,无论是英文字母还是汉字每个字符都是占用2个字节。但是在jni中的字符时utf-8编码,每个字符不是等长的。所以在java和jni调用的时候要注意这个问题。

 

下面是我在网上找到的一些把jstring和char*转换的一些sample代码:

/**
 * 工具方法,把java的string类型转化成 c的str
 */
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
 char* rtn = NULL;
 jclass clsstring = (*env)->FindClass(env, "java/lang/String");
 jstring strencode = (*env)->NewStringUTF(env, "GB2312");
 jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
   "(Ljava/lang/String;)[B");
 jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid,
   strencode); // String .getByte("GB2312");
 jsize alen = (*env)->GetArrayLength(env, barr);
 jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);
 if (alen > 0) {
  rtn = (char*) malloc(alen + 1); //"\0"
  memcpy(rtn, ba, alen);
  rtn[alen] = '\0';
 }
 (*env)->ReleaseByteArrayElements(env, barr, ba, 0); //释放内存
 return rtn;
}

 

char* to jstring 
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值