Android JNI C простая функция добавления - PullRequest
2 голосов
/ 28 ноября 2011

Я хотел бы создать простую функцию, которая возвращает значение двух строк.

в основном:

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 *')

ответ будет: "asd qwer", как я могу это сделать?

edit

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

return sall;

только возврат "456"

отредактировано # 3 ПОСЛЕДНИЕ

окончательный рабочий код:

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;
}

Спасибо, Лесли

Ответы [ 2 ]

5 голосов
/ 29 ноября 2011

Здесь есть несколько вопросов:

  1. GetStringUTFChars возвращает jbyte * (строка C с нулевым символом в конце), а не jstring. Эта строка C необходима для манипулирования строками в C.

  2. Вам нужно позвонить ReleaseStringUTFChars, когда вы закончите с этим.

  3. Вам необходимо выделить достаточно памяти для хранения объединенной строки, используя malloc.

  4. Как уже упоминалось, вам нужно объединить две строки 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 голосов
/ 28 ноября 2011

Вы не можете объединить два char* с + в c ++.Попробуйте вместо этого использовать strcat.

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

РЕДАКТИРОВАТЬ:

из документации для strcat:

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

Объединенные строки

Добавляет копию исходной строки в строку назначения.Завершающий нулевой символ в месте назначения перезаписывается первым символом источника, и новый нулевой символ добавляется в конец новой строки, образованной объединением обоих в месте назначения.

Это означает, чточто первый аргумент strcat должен иметь достаточно памяти для размещения всей объединенной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...