我正在尝试使用NDK在我的Android应用程序(4.4)中使用C库(apriltag)。 我使用android工具链预建了库。 之后,我按照本教程(link)在我的C ++模块中使用了apriltag。
我的android.mk:
include $(CLEAR_VARS)
LOCAL_MODULE := apriltag_prebuilt_lib
LOCAL_SRC_FILES := $(LOCAL_PATH)/prebuilt/libapriltag.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := gle_main
...
LOCAL_LDLIBS := -landroid -llog -lEGL -lGLESv2
LOCAL_SHARED_LIBRARIES += apriltag_prebuilt_lib
LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
然而,只要我在另一个模块中引用它,我的应用程序甚至无法启动。 Android监视器告诉我该进程已经死亡。如果我对LOCAL_SHARED_LIBRARIES行发表评论,我可以启动它,但不能在我的模块中使用apriltag ......
此外,它适用于Android 7.使用此设备,我收到无效的DT_NEEDED条目" app / build /.../ libapriltag.so" libgle_main.so(使用apriltag的c ++模块)的错误。
有什么想法让它在我的Android 4.4设备上运行?
编辑1: 我已添加到我的活动中:
static {
System.loadLibrary("apriltag");
System.loadLibrary("gle_main");
}
但现在,我收到了这个错误:
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "sqrt" referenced by "/data/app/com.laas.lumus_app-1/lib/arm/libapriltag.so"
我猜这与数学库有关,所以我加入了gle_main
和我的apriltag_prebuilt_lib
。
LOCAL_LDLIBS += -lm
没有任何改变。
现在,应用程序无法在4.4和7.0设备上启动。
提前谢谢。
答案 0 :(得分:0)
因为您使用的是预建的共享库libapriltag.so
。你必须让gradle将它添加到你的apk中,然后你可以将它用于gle_main
。您必须将此行添加到module / build.gradle脚本
android{
sourceSets.main{
jniLibs.srcDir 'path_to_libapriltag'
}
答案 1 :(得分:0)
最后,我决定将所有源文件放在我的项目中,以便使用Android Studio进行构建,而不是使用外部工具链。