NDK Architecture - PullRequest
       0

NDK Architecture

1 голос
/ 01 февраля 2012

У меня есть приложение для Android с cpp ndk lib.Библиотека основана на объекте с именем Main.Main.cpp:

static Main * instance;
Java_my_package_MainService_initMain()
{
    instance = new Main(); //OK
}

JAVA-часть приложения запускает службу, служба запускает объект Main cpp, а затем запускает действие (я хочу, чтобы служба выполнялась в фоновом режиме, а иногдаесть пользовательский интерфейс для пользователя).Когда я вызываю lib из нового действия, главный объект имеет значение null.

Что я делаю не так?Спасибо, Наум

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

Не знаю, хорошее ли это решение, вот что я делаю.

JNIEXPORT jint JNICALL Java_my_package_MainService_initMain()
{
  Main *instance = new Main();
  return (int)instance;
}

Я приведу объект (объект - просто указатель) к типу int и возвращаю его в Java. Затем Java отправляет объект всем функциям JNI.

0 голосов
/ 11 апреля 2014

Я решил реализовать вызовы System.load в своем классе Application, который расширяет
android.app.Application.
Этот объект гарантированно существует в течение всего жизненного цикла ваших приложений.
Таким образом, не будет разгрузки DLL или перезагрузки, что, конечно, приведет к ненужным накладным расходам.
И поскольку обработка стека (java-sided) довольно сложна (вспомните атрибут «android: launchMode»
, который несколько решает эту проблему),
Я предпочитаю остаться с системой, имеющей дело с такого рода dll-менеджментом.

0 голосов
/ 01 февраля 2013

Вам нужно сохранить ссылку, чтобы создать класс Java, который использует NDK немного по-другому.

Сначала создайте класс Java (давайте назовем его Main), затем свяжем встроенную функцию с методом экземпляра (нестатическим).

Затем вызовите собственный метод из конструктора Main.

Создайте статическую ссылку где-нибудь еще в вашем Java-приложении и инициализируйте ее с помощью «new Main ();».

Теперь ваша ссылка сохранена, поэтому класс java не может быть выгружен, и, следовательно, библиотека также не будет выгружена.

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