Android JNI 笔记 | 字符串操作 |

2019-04-25  本文已影响0人  WnniandaoYu

操作字符串

简单的字符操作

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

上一篇下一篇

猜你喜欢

热点阅读