2011-09-09 3 views
1

CYGWIN에서 Android NDK r6b의 ndk-build로 컴파일 된 mylib이라는 C++ 라이브러리가 있습니다. 결과 라이브러리 파일은 libmylib.so입니다.Android NDK - C++ 라이브러리를 다른 C++ 라이브러리에 정적으로 연결하는 방법

helloworld이라는 mylib의 .hpp 파일을 포함하고 libmylib.so와 링크해야하는 간단한 앱이 있습니다.

helloworld를 컴파일 링커에게 libmylib.so를 찾도록 지시 할 수 있습니다. 난,

  1. libmylib.so가 libhelloworld.so과 병합되지 않은, 그래서 난 자바 코드에서 디렉토리 helloworld를/libs와/armeabi에 libmylib.so 수동
  2. 을 복사해야 다음 "이상한"사실은 명시 적으로 System.loadLibrary로 mylib를로드해야하고 helloworld 라이브러리 (즉 : System.loadLibrary("mylib"); System.loadLibrary("ndkfoo");)를로드하기 전에 mylib를로드해야합니다. 그렇지 않으면 응용 프로그램이 다운됩니다.

내가 1과 2를 수행하면 앱이 완벽하게 작동합니다 (에뮬레이터와 실제 기기에서 모두 테스트 됨). 링커가 libhelloworld를 생성하도록 강제 할 수있는 방법을 알고 싶습니다. 위에서 언급 한 1,2,3을 피하기 위해 libmylib.so와 병합되었습니다.

감사합니다.

ps.

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를 생성하지 않습니다. C++로 작성된 외부 라이브러리를 사용하고 다른 디렉토리 (앱의 jni 디렉토리 아님)에있는 JNI 앱 (JAVA + C++ 코드 포함)을 작성하는 방법을 설명하는 간단한 자습서를보고 싶습니다.

Pss. 내가 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 

답변

0

빌드 MYLIB로 공유 객체 (.so 파일) 대신 정적 라이브러리. 그런 다음 helloworld를 정의하는 Android.mk에서 종속 라이브러리로 정적 라이브러리를 나열하십시오.

LOCAL_STATIC_LIBRARIES := libmylib 
+0

mylib의 Android.mk를 표시 할 게시물을 업데이트했습니다. 문제는 mylib의 Android.mk에 #include $ (BUILD_STATIC_LIBRARY)를 사용하면 아무 것도 수행되지 않습니다 (.so 또는 .a가 생성되지 않음). 또한, 나는 그것이 LOCAL_STATIC_LIBRARIES = ** mylib **이어야하며 ** libmylib **가 아니라고 생각합니다. – Luke

+1

외부 정적 라이브러리가 "mylib"인 경우 파일은 "libmylib.a"가됩니다. LOCAL_STATIC_LIBRARIES에서 libmylib를 원할 것입니다. 얼핏 보면 Android.mk도 멋지게 보입니다. verbose 출력을보기 위해 ndk-build V = 1을 실행 해 보셨습니까?-B를 강제로 재 빌드 해 보셨습니까? – NuSkooler

관련 문제