2011-11-28 91 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