我想创建一个简单的函数,返回两个字符串的值。
基本上是:
的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
答案 0 :(得分:5)
这里有一些问题:
GetStringUTFChars
返回jbyte *
(以空字符结尾的C字符串),而不是jstring
。你需要这个C字符串在C中进行字符串操作。
完成后,您需要致电ReleaseStringUTFChars
。
您需要使用malloc
分配足够的内存来保存连接字符串。
正如ethan所提到的,您需要将两个C字符串与strcat
连接起来。 (您不能使用+
运算符执行此操作。当应用于指针时,+
将返回指针与原始指针的偏移量。)
请记住在完成之后释放您分配的内存(即,在将其作为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;
答案 1 :(得分:0)
您无法在c ++中将两个char*
与+
连接起来。请尝试使用strcat
。
http://www.cplusplus.com/reference/clibrary/cstring/strcat/
编辑:
来自strcat的文档:
char * strcat(char * destination,const char * source);
连接字符串
将源字符串的副本附加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且新的空字符附加在由目标中的两个串联形成的新字符串的末尾。
这意味着strcat的第一个参数需要分配足够的内存以适应整个连接字符串。