JNI中jstring 和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代码:

 

jstring to char* 
char* jstringTostring(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;
}

 

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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将`jstring`类型的字符串转换为`char*`类型,你可以使用Java Native Interface (JNI) 提供的函数来完成。下面是一个示例代码,展示了如何将`jstring`转换为`char*`: ```cpp #include <jni.h> #include <cstring> char* jstringToChar(JNIEnv* env, jstring jstr) { const char* str = env->GetStringUTFChars(jstr, nullptr); char* result = strdup(str); env->ReleaseStringUTFChars(jstr, str); return result; } int main() { JavaVM* jvm; // 从JNI获取JavaVM实例 JNIEnv* env; // 从JavaVM获取JNIEnv实例 // 获取JNIEnv实例 jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), nullptr); // 假设我们有一个jstring对象 jstring jstr = ...; // 将jstring转换char* char* str = jstringToChar(env, jstr); // 使用转换后的char*字符串 // ... // 释放char*字符串的内存 delete[] str; // 分离线程 jvm->DetachCurrentThread(); return 0; } ``` 在这个示例,我们定义了一个名为`jstringToChar`的函数,它接受一个`JNIEnv*`参数和一个`jstring`参数,并返回一个`char*`指针。在函数内部,我们使用`env->GetStringUTFChars(jstr, nullptr)`函数获取`jstring`对象的UTF-8格式字符串,并使用`strdup`函数创建一个新的字符串副本。然后,我们使用`env->ReleaseStringUTFChars(jstr, str)`函数释放`jstring`对象的UTF-8格式字符串。 在使用转换后的`char*`字符串时,你可以根据需要进行操作。在示例,我们假设你已经从JNI获取了JavaVM实例和JNIEnv实例,并在主函数使用了示例代码。 请记住,在使用完转换后的`char*`字符串后,要记得释放它的内存,以避免内存泄漏。在示例,我们使用了`delete[] str`来释放内存,但这取决于你在分配内存时使用的方法。 请注意,这只是一个示例代码,具体实现可能会因为JNI的使用方式和上下文而有所不同。确保根据你的实际需求进行适当的修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值