Android NDK Confusion - PullRequest
       2

Android NDK Confusion

2 голосов
/ 03 сентября 2010

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

Тем не менее. Это правильное использование NDK? Я имею в виду, если у меня есть игра со многими классами на С ++, которую я хочу перенести на андроид. Должен ли я действительно вручную изменить все мои методы, например:

JNIEXPORT jstring JNICALL Java_com_domain_ndk_NativeLib_hello
  (JNIEnv * env, jobject obj) {
        return (*env)->NewStringUTF(env, "Hello World!");
}

Я не вижу, чтобы это был очень эффективный способ переноса моего кода, и у меня возникает ощущение, что я неправильно использую NDK. Я также понятия не имею, как должны работать образцы NDK. Может ли кто-нибудь указать мне правильное направление?

Спасибо

Ответы [ 4 ]

5 голосов
/ 24 сентября 2010

Вам не нужно изменять ЛЮБОЙ из существующих методов, чтобы использовать формат JNI с «автоматической привязкой». В примерах Google NDK нет хороших примеров, но Google SDK использует другой внутренний метод привязки JNI: Поиск RegisterNatives () в документах JNI. Но даже тогда вам действительно нужно создать оболочку только для тех немногих мест, в которых Android SDK должен общаться с вашей библиотекой: пользовательский ввод / датчики в целом, обратный вызов отрисовки и, возможно, обратный вызов «обновления». Кроме того, остальная часть вашего приложения должна оставаться нетронутой, кроме как для его сборки.

Чтобы упростить вещи, я бы порекомендовал вам не использовать нативные виджеты; если вы сохраняете свою игру полностью в OpenGL, вы можете избежать прохождения через Java, например, рисования текстур на экране, по крайней мере, если вы нацелены на устройства 1.6 и новее, где NDK имеет собственные привязки для OpenGL.

Вопреки некоторым мнениям (включая мнения Google), NDK может и используется для переноса игр на Android. Я использую это таким образом прямо сейчас, на самом деле. Вам нужно передать пользовательские события из Java в C ++, и вам нужно, чтобы Java настроил базовый контекст GL (в NDK нет привязок EGL), но вы можете делать почти все остальное в C ++ с OpenGL и, как только вы основные сообщения Java передаются в C ++, вы можете (в основном) игнорировать Java. Слава Богу. :)

Вам все равно нужно будет поговорить с Java на предмет звука и получить доступ к вашим файлам: обоим по-прежнему нужно пройти через Java, и поэтому вам, вероятно, захочется использовать «обратный JNI», когда вы вызываете Java функция из C ++. Также не сложно, и есть примеры повсюду.

Я подробнее расскажу о том, как получить доступ к вашим ресурсам, здесь: Файловые операции в Android NDK

Удачи.

4 голосов
/ 03 сентября 2010

Я бы сказал, что вы не ошиблись, но имейте в виду, что передача данных между кодом Java и C / C ++ занимает много времени.В связи с этим я бы предложил вам написать большую часть кода на C / C ++ и просто вызывать функции C / C ++ из Java, если этого нельзя избежать.Например, вам нужно будет передать данные обратно для графического интерфейса.Особенно, когда вы программируете игру в реальном времени, я бы избегал слишком частой передачи данных между кодом Java и C / C ++.Так что просто изменить все методы и затем вызвать их в вашем Java-коде было бы не очень хорошей идеей.

Кстати, если вам нужно что-то передать из C / C ++ в Java, я бы не передавал это как возвращаемое значение, а скорее дал бы назначение в качестве параметра в вызове функции.

1 голос
/ 21 декабря 2010

Новая версия ndk (r5) теперь включает возможность писать приложения полностью в нативном коде.

1 голос
/ 03 сентября 2010

NDK - это просто родная среда разработки C и C ++ для Android. Bionic (версия libc для Android) немного более ограничена. Единственное реальное осложнение - это интеграция вашего нового компонента в цепочку инструментов сборки Android. Android имеет настроенную систему Makefile. Загрузка исходного кода и просмотр простых нативных компонентов должны дать вам представление о том, как его использовать.

Теперь, если вы хотите интегрировать Java с C или C ++, вам необходимо понимать собственный интерфейс Java (JNI). Вы должны быть в состоянии найти хорошую документацию JNI онлайн.

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