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

转载于:https://www.cnblogs.com/qiengo/archive/2012/10/23/2735461.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值