安卓JNI C的简单附加功能

 2023-01-20    316  

问题描述

id喜欢做一个简单的函数,返回两个字符串的值,基本上是:

java

安卓JNI C的简单附加功能

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: warning: initialization discards qualifiers from pointer target type
jni/hello-jni.c:34: error: invalid operands to binary + (have 'char *' and 'char *')

retval将是:” ASD QWER”,我该怎么做?

jstring s1  = (*env)->NewStringUTF(env, "456");
jstring s2  = (*env)->NewStringUTF(env, "123");
jstring sall=strcat(s1, s2);

return sall;

仅返回” 456″

推荐答案

这里有一些问题:

  1. GetStringUTFChars返回a jbyte *(一个null终止的C字符串),而不是jstring.您需要此c字符串才能在c.

  2. 中进行字符串操作

  3. 完成后需要致电ReleaseStringUTFChars

  4. 您需要使用malloc.

  5. 正如Ethan提到的,您需要将两个C字符串与strcat串联. (您不能使用+运算符进行此操作.当应用于指针时,+将指针从原始指针的偏移返回.)

  6. 记住,完成后,请释放您分配的内存(即,在被定义为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;

其他推荐答案

您不能在C ++中与+串联两个char*.尝试使用strcat.

strcat/

编辑:

来自Strcat的文档:

char * strcat(char *目的地,const char * source);

连接弦

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

.

这意味着strcat的第一个参数需要分配足够的内存以适合整个串联字符串.

以上所述是小编给大家介绍的安卓JNI C的简单附加功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26032.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。