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");
}
相關文章
相關標籤/搜索