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

  • 相关阅读:
    python增量爬虫pyspider
    python进程池:multiprocessing.pool
    1. 装饰器入门
    python绘图:matplotlib和pandas的应用
    高效使用 Python 可视化工具 Matplotlib
    python制作爬虫爬取京东商品评论教程
    python 爬取天猫美的评论数据
    mysql view
    mysql alter使用
    export和export default
  • 原文地址:https://www.cnblogs.com/qiengo/p/2735461.html
Copyright © 2011-2022 走看看