System.loadLibrary () не работает в некоторых случаях - PullRequest
3 голосов
/ 01 мая 2019

Я играю в игру cocos2d-x, и у меня было странное поведение, я не уверен, нормальное ли это или что происходит, но это то, что происходит, поэтому класс AppActivity.java расширяет класс Cocos2dxActivity.java.Мне не нужно было вызывать System.loadLibrary("MyGame"); в моем классе AppActivity.java, так как он вызывается в Cocos2dxActivity.java.Но это то, что происходит, если я делаю обычное объявление, как это

private native String invokeNativeString();

, все работает нормально, но затем я пытаюсь объявить это прямо под ним, и я получаю эту ошибку

String ami = new String(invokeNativeString());

Иесть ошибки:

05-01 09:11:27.250 10135-10135/com.izzyjmachado.spaceball E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.izzyjmachado.spaceball, PID: 10135
        java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String org.cocos2dx.cpp.AppActivity.invokeNativeString() (tried Java_org_cocos2dx_cpp_AppActivity_invokeNativeString and Java_org_cocos2dx_cpp_AppActivity_invokeNativeString__)

Почему это работает, когда я объявляю нормальную нативную строку, но когда я использую метод внутри объявления строки, он не находит метод?

Я смогчтобы решить это, вызвав это в моем AppActivity классе, но я чувствую, что это должно работать без необходимости вызывать loadLibrary в моем appActivity классе, так как он уже вызывается в Cocos2dxActivity и appActivity extends Cocos2dxActivity?спасибо за любую помощь, ребята, вы можете дать мне

static {
    System.loadLibrary("MyGame");
}

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Это потому, что ваша активность вызывает super.onCreate() на раннем этапе onCreate(). Просто чтобы прояснить: Вот как это следует называть, вы не ошиблись.

Но. Авторы Cocos2dxActivity решили загрузитьродная библиотека во время onCreate().У них была веская причина для принятия этого решения: это позволило им извлечь android.app.lib_name из вашего пакета и таким образом выбрать правильную библиотеку.

Учебники по JNI обычно рекомендуютзагрузить собственные библиотеки в блоке static {}.Последнее является более безопасной практикой (например, оно решает вашу проблему с инициализацией поля), но оно также имеет свои недостатки.

В нижней строке вы можете переместить инициализацию поля ami в AppActivity.onCreate(), если вам это нравится, или вы можете использовать блок static в своей AppActivity., если вы предпочитаете.Конечный пользователь не заметит разницу.

1 голос
/ 01 мая 2019

Кажется, вы пытались вызвать нативную функцию, пока нативная библиотека еще не загружена.

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