Проблемы с использованием общего объекта C ++ в Android Studio - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь понять, как Android Studio работает с файлом ".so" общих библиотек. Их простой Hello World с C ++ прекрасно работает, но я работаю над переносом большого набора кода C ++ на Android и хочу понять, как это сделать проще всего. Я не обязательно хочу добавить файл CMakeLists.txt в Android Studio, так как часть кода не собирается с использованием cmake.

Я создал два проекта в Android Studio. Hello World CPP с поддержкой C ++, и она отлично работает. Я также создал поддержку Hello World Java (без C ++).

Моя цель состояла в том, чтобы взять файлы libnative-lib.so, созданные в проекте CPP Hello World, скопировать их в Java Hello World и изменить код Java для ссылки на функцию stringFromJNI ().

В версии Java я создал каталог apps / src / main / jniLibs и скопировал весь каталог ./app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/ из версии CPP. Это файлы, которые я принес.

~ / AndroidStudioProjects / HelloJava / app / src / main / jniLibs $ ls -R .: arm64-v8a armeabi-v7a x86 x86_64

.

/ arm64-V8A: libnative-lib.so

.

/ armeabi-v7a: libnative-lib.so

.

/ x86: libnative-lib.so

.

/ x86_64: libnative-lib.so

Затем я вернулся к классу MainActivity в версии Java и скопировал

  static {
        System.loadLibrary("native-lib");
    }

и добавил следующее в конец onCreate. (Я добавил идентификатор в макет, чтобы R.id.sample_text действовал.)

TextView tv = (TextView) findViewById(R.id.sample_text);
tv.setText(stringFromJNI());

Сборка работает нормально, но когда я пытаюсь запустить AVD, я получаю следующую ошибку.

E/.gary.hellojav: No implementation found for java.lang.String com.example.gary.hellojava.MainActivity.stringFromJNI() (tried Java_com_example_gary_hellojava_MainActivity_stringFromJNI and Java_com_example_gary_hellojava_MainActivity_stringFromJNI__)
D/AndroidRuntime: Shutting down VM

Я удалил вызов stringFromJNI, и он отлично работает в AVD. Я изменил имя библиотеки в вызове loadLibrary на что-то недопустимое, и loadLibrary выдает исключение, поэтому кажется, что он находит библиотеку, я просто не могу разрешить имя stringFromJNI совершенно правильно.

Есть предложения или очевидный недосмотр с моей стороны?

1 Ответ

0 голосов
/ 14 сентября 2018

Я нашел проблему. Проблема в файле native-lib.cpp - полное имя было неверным при переходе от одного проекта к другому, так как имя проекта было встроено в stringFromJNI. Мне нужно было изменить

Java_com_example_gary_hcpp_MainActivity_stringFromJNI

до

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