2011-11-28 21 views
2

编号喜欢做一个简单的函数,即返回两个字符串的值。Android JNI C简单追加函数

基本上:

的java

public native String getAppendedString(String name); 

Ç

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 /你好-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的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

回答

4

这里有几个问题:

  1. GetStringUTFChars返回jbyte *(一个空值终止的C字符串),而不是一个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; 
+0

这段代码不工作,它给我很多Logcat中的错误,只是强制关闭而没有“更加紧密”的消息。 – lacas

+0

和大量的内存地址是在我的LogCat与绿色... – lacas

+0

是的,你是对的,我忘了'strcat'如何工作。 –

0

你不能在C++中连接两个char*+。请尝试使用strcat

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

编辑:

从文档的strcat:

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

Concatenate strings

Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a new null-character is appended at the end of the new string formed by the concatenation of both in destination.

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

+0

抱歉,但都是jstrings,不是char * – lacas

+1

基于编译器错误,他们都是字符*的变相[类型定义]的 – SSpoke

+0

+操作也不会的jstring的,这是SSpoke指出工作出来,基本上是char *。我仍然建议使用strcat来连接两个字符串。 – ethan