Android NDK about Library (static library , share library and 3rd party library)
2012-10-23 14:27
211 查看
A:Static library
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_STATIC_LIBRARY)
文件Application.mk:
APP_MODULES :=hello-jni
B: Share library
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
C: [b]Static library+Share library
[/b]
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_static
LOCAL_SRC_FILES := src.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_shared
LOCAL_SRC_FILES := src2.c
LOCAL_STATIC_LIBRARIES := mylib_static
include $(BUILD_SHARED_LIBRARY)
D:Using 3rd party static library
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := thirdlib1 # name it whatever
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libthird1.a # or $(so_path)/libthird1.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY) #or PREBUILT_SHARED_LIBRARY
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_use_thirdlib
LOCAL_SRC_FILES := src.c
LOCAL_STATIC_LIBRARIES := thirdlib1 #or LOCAL_SHARED_LIBRARY
include $(BUILD_SHARED_LIBRARY) #if static lib,need Application.mk(needn't,I have cheked!)
Saw the orange line,we know that this method actually consider the 3rd party library as a static library whoever is static or shared.
When I use the static library ,I always got the undefined reference to** error no matter what I do.After a whole tough day,I found that it's not the problem of the mk file,it's the library!Holy Shit!!
My static library was built in cygwin of windows.Of course it can't be used in Linux!!!!Then I built it with android ndk tool and it runs perfectly!!!
a. check your library's mode (whether it isARM)
$ file libtest.so
libtest.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped
make sure you library is ARM mode.
b. use nm to view the method of the so file
$ nm libtutorial.so |grep T
00001344 a _GLOBAL_OFFSET_TABLE_
000002a8 T getinformation
000002b4 T getinformation2
To use android ndk tool:http://stackoverflow.com/questions/7403036/compile-library-for-android-ndk
What you will need to do this is the android Native Development Kit (NDK)http://developer.android.com/sdk/ndk/index.html and a GCC compiler.
E:Using 3rd party shared library
If you use shared library,it seems that you have to load it in java code:
![](http://pic002.cnblogs.com/images/2012/400512/2012122009520554.png)
and you hava to add the following to your java code:
Android.mk:
open the lib in c/c++:
If you don't want to load it in java layer,yuo have to use the absolute addr "/data/data/com.wzh.test/lib/libtwolib-first.so" .The NDK will put the library in lib folder.
For static lib ,needn't dlopen().
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_STATIC_LIBRARY)
文件Application.mk:
APP_MODULES :=hello-jni
B: Share library
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
C: [b]Static library+Share library
[/b]
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_static
LOCAL_SRC_FILES := src.c
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_shared
LOCAL_SRC_FILES := src2.c
LOCAL_STATIC_LIBRARIES := mylib_static
include $(BUILD_SHARED_LIBRARY)
D:Using 3rd party static library
文件Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := thirdlib1 # name it whatever
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libthird1.a # or $(so_path)/libthird1.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY) #or PREBUILT_SHARED_LIBRARY
include $(CLEAR_VARS)
LOCAL_MODULE := mylib_use_thirdlib
LOCAL_SRC_FILES := src.c
LOCAL_STATIC_LIBRARIES := thirdlib1 #or LOCAL_SHARED_LIBRARY
include $(BUILD_SHARED_LIBRARY) #if static lib,need Application.mk(needn't,I have cheked!)
Saw the orange line,we know that this method actually consider the 3rd party library as a static library whoever is static or shared.
When I use the static library ,I always got the undefined reference to** error no matter what I do.After a whole tough day,I found that it's not the problem of the mk file,it's the library!Holy Shit!!
My static library was built in cygwin of windows.Of course it can't be used in Linux!!!!Then I built it with android ndk tool and it runs perfectly!!!
a. check your library's mode (whether it isARM)
$ file libtest.so
libtest.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped
make sure you library is ARM mode.
b. use nm to view the method of the so file
$ nm libtutorial.so |grep T
00001344 a _GLOBAL_OFFSET_TABLE_
000002a8 T getinformation
000002b4 T getinformation2
To use android ndk tool:http://stackoverflow.com/questions/7403036/compile-library-for-android-ndk
What you will need to do this is the android Native Development Kit (NDK)http://developer.android.com/sdk/ndk/index.html and a GCC compiler.
E:Using 3rd party shared library
If you use shared library,it seems that you have to load it in java code:
![](http://pic002.cnblogs.com/images/2012/400512/2012122009520554.png)
and you hava to add the following to your java code:
System.loadLibrary("twolib-first"); System.loadLibrary("twolib-second");
Android.mk:
LOCAL_PATH:= $(call my-dir) #the following is to make sure that the libtwolib-first.so can be packed to the apk file, # which will be put in the data/data/package_name/lib folder. include $(CLEAR_VARS) LOCAL_MODULE := libtwolib-first LOCAL_SRC_FILES := libtwolib-first.so include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libtwolib-second LOCAL_SRC_FILES := second.c LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
open the lib in c/c++:
void* libhandle = dlopen("./libtwolib-first.so",RTLD_LAZY); if(libhandle){ LOGI("open 1 success!"); int (*first)(int x, int y); first=dlsym(libhandle,"first"); if(first){ LOGI("first function success!"); res=first(x,y); }else{ LOGI("first function failed!"); } }else{ LOGI("open 1 failed"); }
If you don't want to load it in java layer,yuo have to use the absolute addr "/data/data/com.wzh.test/lib/libtwolib-first.so" .The NDK will put the library in lib folder.
For static lib ,needn't dlopen().
相关文章推荐
- Android NDK about Library (static library , share library and 3rd party library)
- Android NDK static shared library
- Android NDK – Static & Shared Library Usage
- glob.h and glob.c for the Android NDK
- Sth. about Static Library
- The blog about Sample Browser_Serach,download,learn,share, and request code samples
- Issues about gradle version and Android Plugin Version
- Build fat static library (device + simulator) using Xcode and SDK 4+
- Lipo - Making a fat static library for iOS device and simulator
- android ndk CPUs and Architectures
- Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version
- use cmake to compile static library and test
- Sth. about Static Library
- Android Activity class and static members
- android NDK install and config in ubuntu
- How to include <android/bitmap.h> and other *.h NDK libraries to Titanium Android module?
- How to include <android/bitmap.h> and other *.h NDK libraries to Titanium Android module?
- Android Studio and NDK Integration on Windows Step by Step with a Hello JNI example
- What Every Computer Programmer Should Know About Windows API, CRT, and the Standard C++ Library
- more interesting new about IOS and Android