Android JNI开发系列(六)字符串操做

JNI字符串操做

  • 字符串是引用数据类型,不属于基本数据类型java

  • Java 使用unicode编码,C使用UTF-8,因此在操做中函数

  • C语言的字符串操做在头文件<string.h>编码

示例代码code

public native String sayHello(String string);

public native String subStr(String string);

public native String stringFromJNI();
JNIEXPORT jstring JNICALL
Java_org_professor_jni_MainActivity_sayHello(JNIEnv *env, jobject instance, jstring string_) {
    //函数内部会分配内存空间
    //JNI_FALSE 表明不拷贝jstring对象的字符串序列
    //JNI_TRUE 表明拷贝jstring对象的字符串序列
    const char *string = (*env)->GetStringUTFChars(env, string_, JNI_FALSE); //0表明JNI_FALSE

    char buff[100] = {"I am from C \n"};

    strcpy(buff, string_);

    //释放函数内部内存空间
    (*env)->ReleaseStringUTFChars(env, string_, string);

    return (*env)->NewStringUTF(env, buff);
}

JNIEXPORT jstring JNICALL
Java_org_professor_jni_MainActivity_subStr(JNIEnv *env, jobject instance, jstring string_) {
//    const char *string = (*env)->GetStringUTFChars(env, string_, 0);
    //获取字符串长度
    int strLength = (*env)->GetStringUTFLength(env, string_);
    char buffer[strLength];
    //截取字符串长度 内存没有分配,不用调用ReleaseStringUTFChars
    (*env)->GetStringUTFRegion(env, string_, 5, strLength - 5, buffer);
    strcpy(buffer, "\n");
//    (*env)->ReleaseStringUTFChars(env, string_, string);

    return (*env)->NewStringUTF(env, buffer);
}

JNIEXPORT jstring JNICALL
Java_org_professor_jni_MainActivity_stringFromJNI(JNIEnv *env, jobject instance) {
    return (*env)->NewStringUTF(env, "I am form c");
}
相关文章
相关标签/搜索