Как вызвать методы Java из C ++ в JNI - PullRequest
1 голос
/ 11 октября 2010

Итак, я пишу приложение для Android, которое использует большую библиотеку c ++. У меня все работает, так что приложение java может вызывать методы делегирования c ++, но я чувствую, что хочу записывать сообщения с c ++ в журнал Android. Это легко сделать из Java, но я не знаю, как вызвать метод Java из C ++. Мои поиски нашли методы для открытия jvm из c ++, что совсем не то, что я хочу сделать. В идеале я хотел бы передать указатель на метод логирования на c ++, который затем мог бы использоваться всякий раз, когда я хотел. Конечно, Java не поддерживает указатели методов. Мой метод Java будет выглядеть примерно так:

private void log(String s){
   Log.i(Tag, s);     // Android log
}

Я просто не знаю, как разрешить c ++ доступ к этому методу.

Ответы [ 2 ]

6 голосов
/ 11 октября 2010

C ++ вызовы cout и printf не будут отображаться в выводе LogCat. Есть два решения.

  1. Используйте макросы Logging, предоставленные NDK, которые позволяют вам регистрировать сообщения в LogCat. Это хорошо для нового кода и кода обертки, которые вы пишете, но не так хорошо, когда у вас есть библиотека, полная существующих отладочных операторов. Я определяю макросы следующим образом:

    #define LOG_INFO(info) __android_log_write(ANDROID_LOG_INFO,"JNI",info)
    #define LOG_ERROR(error) __android_log_write(ANDROID_LOG_ERROR,"JNI",error)
    

    и затем в исходном коде я могу позвонить LOG_INFO("Library is called!");

  2. Записать стандартную / стандартную ошибку программы и направить ее в LogCat. Со страницы Android Debug Bridge :

    Просмотр stdout и stderr

    По умолчанию система Android отправляет выходные данные stdout и stderr (System.out и System.err) в / dev / null. В процессах, запускающих виртуальную машину Dalvik, система может записать копию выходных данных в файл журнала. В этом случае система записывает сообщения в журнал, используя теги журнала stdout и stderr, оба с приоритетом I.

    Чтобы направить вывод таким образом, вы останавливаете работающий экземпляр эмулятора / устройства и затем используете команду оболочки setprop, чтобы включить перенаправление вывода. Вот как вы это делаете:

      $ adb shell stop
      $ adb shell setprop log.redirect-stdio true
      $ adb shell start
    

    Система сохраняет этот параметр до тех пор, пока вы не прекратите работу экземпляра эмулятора / устройства. Чтобы использовать настройку по умолчанию для экземпляра эмулятора / устройства, вы можете добавить запись в /data/local.prop на устройстве.

0 голосов
/ 11 октября 2010

Запись ведется в заголовочном файле "#include".

Чтобы связать .so, поместите 'LOCAL_LDLIBS: = -L $ (SYSROOT) / usr / lib -llog' в вашем файле make.

...