操作字符串
简单的字符操作
问:有这么一个 native 方法:public native String getHelloString();
,该方法可以获取到一个"Hello"的字符串。而我需要把这个字符串打印出来,怎么操作呢?(.cpp文件已经创建并关联好了)
首先,在 java 类中写入native方法:
public native String getHelloString();
然后,在.cpp文件中加入关联方法:
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_MainActivity_getHelloString(JNIEnv *env, jobject instance)
{
char* value = "Hello";
return env->NewStringUTF(value);
}
调用
String helloString = getHelloString();
Log.d(TAG, "onCreate: helloString = " + helloString);
最终日志输出
04-25 14:30:16.789 onCreate: helloString = Hello
比较复杂的字符操作
问:有这么一个 native 方法:public native String manipulationStr(String string);
,该方法可以对传入的字符做一个修改,在字符的后面加入一个或一个以上的字符,然后返到Java中进行打印,怎么操作呢?(.cpp文件已经创建并关联好了)
首先,在 java 类中写入native方法:
public native String manipulationStr(String name);
然后,在.cpp文件中加入关联方法:
/**
* jstring 转 char
*/
char *Jstring2CStr(JNIEnv *env, jstring jstr) {
char *rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
//这里填写是工作空间的编码,若是默认中文则是GB2312
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;
}
// 第一种实现方式
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_MainActivity_manipulationStr(JNIEnv *env, jobject instance, jstring string_) {
{
char *str = "你好";
char *string = Jstring2CStr(env, string_);
strcat(str,string);
return env->NewStringUTF(str);
}
// 第二种实现方式
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_MainActivity_manipulationStr(JNIEnv *env, jobject instance, jstring string_) {
{
jstring stringValue = env->NewStringUTF
(strcat((char *)env->GetStringUTFChars(string_, JNI_FALSE), "你好"));
return stringValue;
}
调用
String nameStr= manipulationStr("小明");
Log.d(TAG, "onCreate: nameStr = " + nameStr);
最终日志输出
04-25 15:26:52.699 onCreate: nameStr = 小明你好