Android загрузить нативную библиотеку - PullRequest
4 голосов
/ 02 июня 2011

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

Я собрал libGLmove.so и поместил его в libs / armeabi моего проекта Eclipse

Однако при вызове System.loadLibrary("GLmove") выдается UnsatisfiedLinkError

Есть идеи, как решить проблему или заставить Android найти мою библиотеку? Как ndk-build упаковывает библиотеку после ее сборки?

Редактировать: Точные флаги компиляции:

/ Users / thomas / Documents / android-ndk-r5b / toolchains / arm-eabi-4.4.0 / prebuilt / darwin-x86 / bin / arm-eabi-g ++ --sysroot = / пользователи / thomas / Documents / android-ndk-r5b / platform / android-8 / arch-arm -march = armv7-a -mfloat-abi = softfp -mfpu = неон -Wl, - fix-cortex-a8 -fno-исключения -fno-rtti - nostdlib -fpic -shared -o GLmove.so -O3

Ответы [ 5 ]

4 голосов
/ 09 июня 2011

Вы проверили полученный файл .APK (воспользуйтесь утилитой zip, чтобы просмотреть / разархивировать его), чтобы убедиться, что ваша библиотека прошла через упаковку? Я немного подозреваю, что это не так, потому что я замечаю, что все, что встроено в папку «libs» в проекте и на моей сборочной машине, попадает в папку с именем «lib» (no 's') в APK .

Я бы не слишком удивился, если бы выяснилось, что процесс сборки Eclipse не упаковывает библиотеки, о которых он не знает. Это, конечно, в отличие от того, что происходит с ресурсами, которые просто упаковываются в силу того, что находятся в нужном месте.

Если вы обнаружите, что вашей библиотеки нет в вашем APK-файле, я не думаю, что вы можете просто вставить ее туда вручную, поскольку она не будет отображаться в манифесте пакета и также нарушит подпись.

Вы не упоминаете, является ли ваш проект Eclipse проектом NDK (щелкните правой кнопкой мыши по проекту, Инструменты Android-> Добавить встроенную поддержку.) Если нет, то я подозреваю, что вам нужно сделать его одним добавьте свою библиотеку в файл Android.mk как зависимость, а не как цель.

Или: вы можете попробовать поместить вашу библиотеку в / res в проекте и использовать System.load () вместо System.loadLibrary () для ее загрузки. Я признаю, что я никогда не пробовал это сам, хотя.

2 голосов
/ 03 июня 2011

Я столкнулся с этой же проблемой. Вещи, которые я имел неправильно.

  1. В файле make у меня неправильно написано "LOCAL_SRC_FILES".
  2. В исходном файле c у меня было имя библиотеки внутри имени метода

Java_com_my_namespace_libname_activity_methodName(JNIEnv* env, jobject _this) {<br> //Fancy Native Junk Here<br> }

Как только я исправил эти две вещи, перезапустил ndk-build и обновил проект eclipse с F5, он начал работать.

2 голосов
/ 04 июня 2011

Вы не даете очень много подробностей, но может случиться так, что созданный вами .so зависит от библиотеки, которая недоступна в используемой вами версии телефона.

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

1 голос
/ 09 июня 2011

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

Также этот учебник может оказаться полезным: http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/

1 голос
/ 02 июня 2011

Не могли бы вы проверить синтаксис и расположение System.loadLibrary ("GLmove")

вызов System.loadLibrary должен находиться в статическом блоке исходного файла Java

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

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jniexamp.html

...