Android JNI C简单附加功能

时间:2011-11-28 19:29:38

标签: java android java-native-interface

我想创建一个简单的函数,返回两个字符串的值。

基本上是:

的java

public native String getAppendedString(String name);

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);
}

它的说法

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;

仅返回“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;
}

谢谢,Leslie

2 个答案:

答案 0 :(得分:5)

这里有一些问题:

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

  2. 完成后,您需要致电ReleaseStringUTFChars

  3. 您需要使用malloc分配足够的内存来保存连接字符串。

  4. 正如ethan所提到的,您需要将两个C字符串与strcat连接起来。 (您不能使用+运算符执行此操作。当应用于指针时,+将返回指针与原始指针的偏移量。)

  5. 请记住在完成之后释放您分配的内存(即,在将其作为Java字符串实现之后)。

  6. 你应该采取以下措施:

    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;
    

答案 1 :(得分:0)

您无法在c ++中将两个char*+连接起来。请尝试使用strcat

http://www.cplusplus.com/reference/clibrary/cstring/strcat/

编辑:

来自strcat的文档:

  

char * strcat(char * destination,const char * source);

     

连接字符串

     

将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且新的空字符附加在由目标中的两个串联形成的新字符串的末尾。

这意味着strcat的第一个参数需要分配足够的内存以适应整个连接字符串。