zoukankan      html  css  js  c++  java
  • 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().

  • 相关阅读:
    互联网实习笔记之shell笔记
    互联网实习笔记之30天总结
    记被论文排版虐的一天
    大论文排版技巧
    Matlab2014a使用VS2015混合编译
    腾讯云服务器创建swap空间
    使用vs2015开发linux:Ubuntu程序
    使用VS2015远程GDB调试
    nullptr、NULL、null和0
    《将博客搬至CSDN》
  • 原文地址:https://www.cnblogs.com/qiengo/p/2735461.html
Copyright © 2011-2022 走看看