【问题标题】:Not able to compile external precompiled shared library with Android-NDK无法使用 Android-NDK 编译外部预编译共享库
【发布时间】:2024-05-01 19:35:02
【问题描述】:

我有两个共享库:A.soB.so,并希望将它们与我的 Android Project 链接。

  1. 从 Eclipse 创建一个新的 Android 项目
  2. 右键项目->Android工具->添加原生支持
  3. 它创建了一个新文件夹:JNIJNI/projectname.cppJNI/Android.mk
  4. 现在我将A.soB.so 添加到<Project-folder>/libs/armeabi

当我构建项目时,我在控制台中得到了这个输出:

**** Build of configuration Default for project fona ****

/home/users/android-ndk/ndk-build all 
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml    
[armeabi] Install        : projectname.so => libs/armeabi/libprojectname.so

 *** Build Finished ****

我担心的是它没有使用Project.so 构建A.soB.so。可能是我在Android.mk 文件中缺少一些东西

Android.mk 文件内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := projectname
LOCAL_SRC_FILES := projectname.cpp
include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

  • 你说“它没有用 Project.so 构建 A.so 和 B.so”是什么意思? A.so 和 B.so 已经构建,将按原样使用。只有你的 projectname.so 会构建。
  • @Ganster41 明白了!但是有没有什么办法可以查出它们是否成功地与项目集成了呢?
  • libs/armeabi 文件夹将在每次构建后被清除。看看我的回答,如何正确添加预建。如果 libs 集成正确,它会在构建后复制到 libs/armeabi 文件夹,并会出现在生成的 APK 中。

标签: android eclipse android-ndk shared-libraries


【解决方案1】:

您不能只放置预建库。您还需要将其定义为单独的模块。 将您的 A.so 和 B.so 移动到 jni 文件夹,然后像这样修改您的 Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := A
LOCAL_SRC_FILES := A.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := B
LOCAL_SRC_FILES := B.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := projectname
LOCAL_SRC_FILES := projectname.cpp
include $(BUILD_SHARED_LIBRARY)

【讨论】:

  • 我得到了这个:Android NDK: ERROR:jni/Android.mk:A: LOCAL_SRC_FILES 指向一个丢失的文件
  • 您是否将 A.so 移至 jni 文件夹?如果它有不同的名字,你需要在这一行改变它: LOCAL_SRC_FILES := A.so
  • 看起来您的 A.so 不是正确的 Android 库。是公开的吗?你能分享那个so文件吗?
  • 当然! A.so : dl.dropboxusercontent.com/u/20476478/libFragCatalog.so B.so : dl.dropboxusercontent.com/u/20476478/libSmilesParse.so 实际上我从 C++ 源代码编译了这些库,并使用另外两个库生成了它们:即:libFragCatalog.so.1libFragCatalog.so.1.2014.09.1pre
  • 当我将它们直接放入armeabi 时,它们每个都显示了它们的成员函数。
最近更新 更多