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)
谢谢,莱斯利
这里有一些问题:
GetStringUTFChars返回一个jbyte *(以null结尾的C字符串),而不是a 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8552 次 |
| 最近记录: |