美文网首页
Android JNI 笔记 | 字符串操作 |

Android JNI 笔记 | 字符串操作 |

作者: WnniandaoYu | 来源:发表于2019-04-25 15:28 被阅读0次

    操作字符串

    简单的字符操作

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

    相关文章

      网友评论

          本文标题:Android JNI 笔记 | 字符串操作 |

          本文链接:https://www.haomeiwen.com/subject/dqsagqtx.html