Android NDK about Library (static library , share library and 3rd party library)

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: Static library+Share library

文件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:

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().

posted @ 2012-10-23 14:27  Qiengo  阅读(4970)  评论(2编辑  收藏  举报