Android JNI 笔记 | 字符串操作 |

操作字符串

简单的字符操作

问:有这么一个 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 = 小明你好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容