Я пытаюсь понять, как 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 совершенно правильно.
Есть предложения или очевидный недосмотр с моей стороны?