Android NDK - проблема с подключением внешней библиотеки (не удается ее найти) - PullRequest
5 голосов
/ 09 сентября 2011

Я работаю с Android NDK r6b под Cygwin (система обновляется правильно). Я изменяю пример hello-jni, чтобы научиться работать с NDK. Поскольку у меня есть библиотека, написанная на C ++, которую я хочу использовать в hello-jni (на самом деле, я создал prj с именем helloworld с единственным файлом .cpp с именем ndkfoo.cpp), я создал новый проект Android в Eclipse ( обновлен для Android), добавлен каталог jni, добавлены файлы Android.mk и Application.mk, отредактированы их для компиляции .cpp. В конце компиляции я получаю файл .so .

Теперь в helloworld Android.mk мне нужно внести некоторые изменения, чтобы указать компоновщику включить эту библиотеку. Предположим, что файл библиотеки libmylib.so , у меня есть следующий скрипт android.mk:

LOCAL_PATH: = $ (позвоните в мою директорию)

включает $ (CLEAR_VARS)

LOCAL_MODULE: = ndkfoo

LOCAL_SRC_FILES: = ndkfoo.cpp

LOCAL_C_INCLUDES + = $ (LOCAL_PATH) / mylib

LOCAL_LDLIBS + = -L $ (LOCAL_PATH) /../../ mylib / libs / armeabi / -lmylib

включает $ (BUILD_SHARED_LIBRARY)

Мои каталоги организованы следующим образом:

d:/android/android-ndk-r6b => android ndk root
d:/android/workspace/helloworld => helloworld project
d:/android/workspace/mylib => mylib project library

(следовательно, путь к libmylib.so: d: / android / workspace / mylib / libs / armeabi).

К сожалению, это не похоже на работу. Если я удаляю все ссылки на mylib из ndkfoo.cpp, он компилируется и запускается даже на моем телефоне. Если я не удаляю ссылки на mylib , он компилируется, но не связывается: я получаю следующий результат:

D: /android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windo WS / бен /../ Библиотека / GCC / арм-линукс-androideabi / 4.4.3 /../../../../ рычажного линукс-androideabi / bin / ld.exe: не удается найти -lmylib

Ps. Я забыл упомянуть, что я запускаю ndk-buld в каталоге jni проекта helloworld. ПСС. Я нашел много подобных вопросов в Интернете. Я всегда работал с Visual C / C ++ IDE, поэтому я действительно новичок в GCC, make-файлах и так далее ...

1 Ответ

1 голос
/ 05 октября 2012

Сообщение

D: /android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windo ws / bin /../ lib / gcc / arm-linux-androideabi / 4.4.3 / ../../../../arm-linux-androideabi/ bin / ld.exe: не удается найти -lmylib

указывает, что компоновщик не находит вашу библиотеку, это должно быть из-за проблемы в пути LD_LIBS.

Я думаю, что макрос my-dir не включает идентификатор устройства, поэтому ваша переменная LOCAL_PATH должна пропустить D: и, я думаю, не будет работать с cygwin. Я пользователь Linux и не уверен на 100%, но, если вы замените

LOCAL_PATH := $(call my-dir)

от

LOCAL_PATH := D:$(call my-dir)

это должно работать. С другой стороны, вы всегда можете установить относительный путь, установив:

LOCAL_LDLIBS += -L$../../mylib/libs/armeabi/ -lmylib
...