Android JNI C简单附加功能

lac*_*cas 2 java java-native-interface android

我喜欢做一个简单的函数,即返回两个字符串的值.

基本上:

java的

public native String getAppendedString(String name);
Run Code Online (Sandbox Code Playgroud)

C

jstring Java_com_example_hellojni_HelloJni_getAppendedString(JNIEnv* env,   jobject thiz, jstring s) {
    jstring sx = (*env)->GetStringUTFChars(env, s, NULL);

    return ((*env)->NewStringUTF(env, "asd ")+sx);
}
Run Code Online (Sandbox Code Playgroud)

它说

jni/hello-jni.c:32:警告:初始化从指针目标类型jni/hello-jni.c中丢弃限定符:34:错误:无效的操作数到二进制+(有'char*'和'char*')

retval将是:"asd qwer",我该怎么做?

编辑

jstring s1  = (*env)->NewStringUTF(env, "456");
jstring s2  = (*env)->NewStringUTF(env, "123");
jstring sall=strcat(s1, s2);

return sall;
Run Code Online (Sandbox Code Playgroud)

只返回"456"

编辑#3 THE LAST

最终的工作代码是:

jstring Java_com_example_hellojni_HelloJni_getAppendedString(JNIEnv* env,   jobject thiz, jstring s1) {
    D("HMMMMMMMMMMMMMMMMMMM");
    jstring s2  = (*env)->NewStringUTF(env, "123");

    jbyte *s1x  = (*env)->GetStringUTFChars(env, s1, NULL);
    jbyte *s2x  = (*env)->GetStringUTFChars(env, s2, NULL);

    char *sall  = malloc(strlen(s1x) + strlen(s2x) + 1);
    strcpy(sall, s1x);
    strcat(sall, s2x);

    jstring retval = (*env)->NewStringUTF(env, sall);

    (*env)->ReleaseStringUTFChars(env, s1, s1x);
    (*env)->ReleaseStringUTFChars(env, s2, s2x);
    free(sall);

    return retval;
}
Run Code Online (Sandbox Code Playgroud)

谢谢,莱斯利

Edw*_*son 5

这里有一些问题:

  1. GetStringUTFChars返回一个jbyte *(以null结尾的C字符串),而不是a jstring.你需要这个C字符串在C中进行字符串操作.

  2. 完成后你需要打电话ReleaseStringUTFChars.

  3. 你需要分配足够的内存来保存连接的字符串malloc.

  4. 正如ethan所说,你需要连接你的两个C字符串strcat.(您不能对+运算符执行此操作.当应用于指针时,+从原始指针的偏移量返回指针.)

  5. 记住在完成它之后释放你分配的内存(即,在它被作为Java字符串实现之后).

你应该做的事情是这样的:

char *concatenated;
const jbyte *sx;
jstring retval;

/* Get the UTF-8 characters that represent our java string */
sx = (*env)->GetStringUTFChars(env, s, NULL);

/* Concatenate the two strings. */
concatenated = malloc(strlen("asd ") + strlen(sx) + 1);
strcpy(concatenated, "asd ");
strcat(concatenated, sx);

/* Create java string from our concatenated C string */
retval = (*env)->NewStringUTF(env, concatenated);

/* Free the memory in sx */
(*env)->ReleaseStringUTFChars(env, s, sx);

/* Free the memory in concatenated */
free(concatenated);

return retval;
Run Code Online (Sandbox Code Playgroud)