【发布时间】:2011-11-14 02:19:24
【问题描述】:
我有一个名为 mylib 的 C++ 库,在 CYGWIN 下使用 Android NDK r6b 的 ndk-build 编译。生成的库文件称为 libmylib.so。
我有一个名为 helloworld 的简单应用,其中包含 mylib 的 .hpp 文件,并且必须与 libmylib.so 链接。
我能够编译 helloworld,告诉链接器寻找 libmylib.so。 “奇怪”的事实是:
- libmylib.so 没有与 libhelloworld.so 合并,所以我必须手动将 libmylib.so 复制到目录 helloworld/libs/armeabi 中
- 在 java 代码中,我必须使用 System.loadLibrary 显式加载 mylib,并且我必须在加载 helloworld 库之前加载 mylib(即:
System.loadLibrary("mylib"); System.loadLibrary("ndkfoo");),否则应用程序崩溃。
如果我执行 1 和 2,则该应用程序运行良好(在模拟器和真实设备上测试)。我想知道如何强制链接器生成一个与 libmylib.so 合并的 libhelloworld.so,以避免上面提到的 1,2 和 3。
谢谢。
附言
mylib 的 Android.mk 是:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := mylib.cpp
include $(BUILD_SHARED_LIBRARY)
#include $(BUILD_STATIC_LIBRARY)
如果我使用 BUILD_SHARED_LIBRARY,我会像往常一样得到 libmylib.so。如果我使用 BUILD_STATIC_LIBRARY,则 ndk-build 不会生成 .so 或 .a。我真的很想看一个简单的教程,它解释了如何构建一个 JNI 应用程序(使用 JAVA + c++ 代码),该应用程序使用一个用 C++ 编写并放置在另一个目录(不是应用程序的 jni 目录)中的外部库。
附言。 当我使用 BUILD_STATIC_LIBRARY mylib 进行编译时,我获得了以下内容(基本上,创建的唯一文件位于目录 /mylib/libs/armeabi/ 下,称为 gdb.setup 和 gdbserver):
$ /cygdrive/d/android/android-ndk-r6b/ndk-build NDK_LOG=1 V=1 -B
Android NDK: NDK installation path auto-detected: '/cygdrive/d/android/android-n
dk-r6b'
Android NDK: GNU Make version 3.81 detected
Android NDK: Host OS was auto-detected: windows
Android NDK: Host CPU was auto-detected: x86
Android NDK: HOST_TAG set to windows
Android NDK: Host awk tool was auto-detected: awk
Android NDK: Host awk test returned: Pass
Android NDK: Probing for 'cygpath' program
Android NDK: 'cygpath' found as: /usr/bin/cygpath
Using cygwin substitution rules:
/cygdrive/d => D:
/cygdrive/c => C:
/cygdrive/D => D:
/cygdrive/C => C:
/usr/lib => C:/cygwin/lib
/usr/bin => C:/cygwin/bin
/ => C:/cygwin
Android NDK: This NDK supports the following toolchains and target ABIs:
Android NDK: arm-linux-androideabi-4.4.3: armeabi armeabi-v7a
Android NDK: x86-4.4.3: x86
Android NDK: Found platform root directory: /cygdrive/d/android/android-ndk-r6b/
platforms
Android NDK: Found supported platforms: android-3 android-4 android-5 android-8
android-9
Android NDK: PLATFORM android-3 supports: arm x86
Android NDK: ABI arm sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-3/arch-arm
Android NDK: ABI x86 sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-3/arch-x86
Android NDK: PLATFORM android-4 supports: arm x86
Android NDK: ABI arm sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-4/arch-arm
Android NDK: ABI x86 sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-4/arch-x86
Android NDK: PLATFORM android-5 supports: arm x86
Android NDK: ABI arm sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-5/arch-arm
Android NDK: ABI x86 sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-5/arch-x86
Android NDK: PLATFORM android-8 supports: arm x86
Android NDK: ABI arm sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-8/arch-arm
Android NDK: ABI x86 sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-8/arch-x86
Android NDK: PLATFORM android-9 supports: arm x86
Android NDK: ABI arm sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-9/arch-arm
Android NDK: ABI x86 sysroot is: /cygdrive/d/android/android-ndk-r6b/platforms
/android-9/arch-x86
Android NDK: Found stable platform levels: 3 4 5 8 9
Android NDK: Found max platform level: 9
Android NDK: Looking for AndroidManifest.xml in /cygdrive/d/android/workspace/my
lib/jni
Android NDK: Looking for AndroidManifest.xml in /cygdrive/d/android/workspace/my
lib
Android NDK: Found it !
Android NDK: Found project path: /cygdrive/d/android/workspace/mylib
Android NDK: Parsing /cygdrive/d/android/workspace/mylib/jni/Application.mk
Android NDK: Found APP_PLATFORM=android-9 in /cygdrive/d/android/workspace/myl
ib/default.properties
Android NDK: Defaulted to APP_BUILD_SCRIPT=/cygdrive/d/android/workspace/mylib
/jni/Android.mk
Android NDK: Application 'local' *is* debuggable
Android NDK: Selecting debug optimization mode (app is debuggable)
Android NDK: Adding import directory: /cygdrive/d/android/android-ndk-r6b/source
s
Android NDK: Building application 'local' for ABI 'armeabi'
Android NDK: Using target toolchain 'arm-linux-androideabi-4.4.3' for 'armeabi'
ABI
Android NDK: Looking for imported module with tag 'cxx-stl/system'
Android NDK: Probing /cygdrive/d/android/android-ndk-r6b/sources/cxx-stl/syste
m/Android.mk
Android NDK: Found in /cygdrive/d/android/android-ndk-r6b/sources/cxx-stl/sy
stem
Android NDK: Module 'mylib' has C++ sources
rm -f /cygdrive/d/android/workspace/mylib/libs/armeabi/lib*.so /cygdrive/d/andro
id/workspace/mylib/libs/armeabi-v7a/lib*.so /cygdrive/d/android/workspace/mylib/
libs/x86/lib*.so
rm -f /cygdrive/d/android/workspace/mylib/libs/armeabi/gdbserver /cygdrive/d/and
roid/workspace/mylib/libs/armeabi-v7a/gdbserver /cygdrive/d/android/workspace/my
lib/libs/x86/gdbserver
rm -f /cygdrive/d/android/workspace/mylib/libs/armeabi/gdb.setup /cygdrive/d/and
roid/workspace/mylib/libs/armeabi-v7a/gdb.setup /cygdrive/d/android/workspace/my
lib/libs/x86/gdb.setup
Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
mkdir -p /cygdrive/d/android/workspace/mylib/libs/armeabi
install -p /cygdrive/d/android/android-ndk-r6b/toolchains/arm-linux-androideabi-
4.4.3/prebuilt/gdbserver /cygdrive/d/android/workspace/mylib/libs/armeabi/gdbser
ver
Gdbsetup : libs/armeabi/gdb.setup
mkdir -p /cygdrive/d/android/workspace/mylib/libs/armeabi
echo "set solib-search-path D:/android/workspace/mylib/obj/local/armeabi" > /cyg
drive/d/android/workspace/mylib/libs/armeabi/gdb.setup
echo "directory D:/android/android-ndk-r6b/platforms/android-9/arch-arm/usr/incl
ude D:/android/android-ndk-r6b/sources/cxx-stl/system/include D:/android/workspa
ce/mylib/jni" >> /cygdrive/d/android/workspace/mylib/libs/armeabi/gdb.setup
【问题讨论】:
标签: android-ndk static-linking