Как jni обеспечивают строковый массив?

Как обеспечить строковый массив?

Я публикую код:

xx.cpp

JNIEXPORT jstring JNICALL Hello_Native(JNIEnv *env, jobject obj,jstring string)
{
    const char *str = env->GetStringUTFChars(string, 0);
    return env->NewStringUTF( "Hello from JNI !");
}
static JNINativeMethod gMethods[] = {
   {"JniHello",const_cast("(Ljava/lang/jsting)Ljava/lang/jsting;"),(void*)Hello_Native}

xx.java

public native static String JniHello(String text);

Система всегда вызывает его, имеет проблему, когда объявляют JniHello в gMethods , и параметр не правильный.

0
nl ja de

3 ответы

  1. stop using wrong manual names for JNICALL functions. javah will generate it for you correctly. If your Java name is JniHello in class MyHello and your package is com.hello , JNICALL function must be Java_com_hello_MyHello_JniHello. It can't be Hello_Native, you have made it up.
  2. then of course this correct function name must be used in the last member of JNINativeMethod struct
  3. there is no such class as java/lang/jsting. There is not even a java/lang/jstring if i add the missing r for you. You are asked for the JAVA signature, not JNI. So it must be java/lang/String.
  4. ADDED (thanks @EJP): stop using wrong manual strings for JNI signatures and use the output of javap -s instead

У вашего кода есть еще одна проблема: когда используемый GetStringUTFChars , необходимо также назвать 'ReleaseStringUTFChars' перед возвращением, иначе у вас есть утечка. Но вы найдете это сами рано или поздно.

2
добавлено
Хороший совет. Я добавил бы ' прекратите использовать неправильные ручные последовательности для подписей JNI и используйте продукцию javap-s instead'. это решило бы (3). +1
добавлено автор EJP, источник
Я предпочитаю ' остановите using' формулировка, которая соглашается с вашим собственным пунктом 1.
добавлено автор EJP, источник
Спасибо @EJP, отредактированное мой ответ:)
добавлено автор Pavel Zdenek, источник
@EJP я не хотел казаться слишком сильным. Но без видимой причины помимо неопределенного гуманистического чувства, я признаю.
добавлено автор Pavel Zdenek, источник

const_cast (" (Ljava/lang/jsting) Ljava/lang/jsting";) ошибка периода, должен быть const_cast (" (Ljava/lang/jsting) Ljava/lang/jstring";)

jsting ==> jstring

1
добавлено
Copy some android source code to help you(JNI):


static jobject osNetworkSystem_getHostByNameImpl(JNIEnv* env, jclass clazz,
        jstring nameStr, jboolean preferIPv6Addresses) {

}

static void osNetworkSystem_setInetAddressImpl(JNIEnv* env, jobject obj,
        jobject sender, jbyteArray address) {

}

static jobject osNetworkSystem_inheritedChannelImpl(JNIEnv* env, jobject obj) {

}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    { "getHostByNameImpl",                 "(Ljava/lang/String;Z)Ljava/net/InetAddress;",                              (void*) osNetworkSystem_getHostByNameImpl                  },
    { "setInetAddressImpl",                "(Ljava/net/InetAddress;[B)V",                                              (void*) osNetworkSystem_setInetAddressImpl                 },
    { "inheritedChannelImpl",              "()Ljava/nio/channels/Channel;",                                            (void*) osNetworkSystem_inheritedChannelImpl               },
};

int register_org_apache_harmony_luni_platform_OSNetworkSystem(JNIEnv* env) {
    return jniRegisterNativeMethods(env,
            "org/apache/harmony/luni/platform/OSNetworkSystem",
            gMethods,
            NELEM(gMethods));
}
1
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)