Хобрук: Ваш путь к мастерству в программировании

Правильный способ получить список строк в JNI

У меня есть функция JNI в C, которая передается в класс Java FILE, который представляет список каталогов. Я хотел бы вызвать функцию list() и получить список строк (файлов в каталоге). Как лучше всего это сделать?

Прямо сейчас у меня есть

static void* my_function(JNIEnv *env, jobject obj, jobject dir){
    jarray listRet;
    jclass cls = (*env)->GetObjectClass(env, dir);
    jmethodID method = (*env)->GetMethodID(env, cls, "list", "()[Ljava/lang/String");
    listRet = (*env)->CallObjectMethod(env, cls, method);

    jsize stringCount = (*env)->GetArrayLength(env, listRet);
}

Однако, добавляя операторы ведения журнала, кажется, что вызов GetObjectClass никогда не проходит. Итак, правильный ли этот призыв? Кроме того, корректен ли вызов GetMethodID? Тип возвращаемого значения list() — это (java) String[]. Есть ли еще что-то, что я делаю не так?


Ответы:


1

list не является статическим методом File. То есть он принадлежит экземпляру File (в вашем случае dir), а не классу File.

Итак, вместо:

listRet = (*env)->CallObjectMethod(env, cls, method);

вы должны использовать:

listRet = (*env)->CallObjectMethod(env, dir, method);

Кроме того, у вас, кажется, отсутствует точка с запятой в подписи для list. Должно быть "()[Ljava/lang/String;"

17.09.2015
  • Спасибо за понимание! Однако все еще кажется, что он задыхается. CallObjectMethod принимает класс в качестве второго параметра. Можно ли напрямую передать каталог jobject? 17.09.2015
  • Нет, CallObjectMethod принимает jobject в качестве второго параметра. Возможно, вы думаете о CallStaticObjectMethod (которое здесь не применимо). 17.09.2015
  • Упс! Конечно, вы правы :) Я смотрел на GetMethodID(). Я тоже пробовал использовать директорию как класс, но без кубиков. Кажется, он продолжает терпеть неудачу в GetMethodID. 17.09.2015
  • Для GetMethodID вы должны передать cls, а не dir. Вы убедились, что cls не равно NULL? 17.09.2015
  • Хм. Похоже, я ошибся, GetObjectClass никогда не вернется. Я вставил сообщение журнала до и после него. То, что до этого появляется, то, что после, никогда не приходит. 17.09.2015
  • На самом деле, похоже, что раньше в коде C было что-то, что вызывало проблемы. Тестирование этого как отдельного приложения JNI работало отлично. В очередной раз благодарим за помощь! 17.09.2015
  • Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...