• NDK中android.mk文件的简单介绍和第三方库的调用


    先贴一个样例,然后解释一下:

     1 LOCAL_PATH:= $(call my-dir)
     2 include $(CLEAR_VARS)
     3 LOCAL_MODULE := mydjvuapi
     4 SRC_FILE_OF_MINE :=
     5     classify.cpp 
     6     cuts.cpp  7 INCLUDES_FILE_OF_MINE:=  8     $(LOCAL_PATH)/../myjpeginterface
     9     $(LOCAL_PATH)/../mytiffinterface10 STATIC_LIBRARIES_OF_MINE:= mupdf djvudroid
    11 LOCAL_CFLAGS    := -DHAVE_CONFIG_H 
    12 LOCAL_C_INCLUDES := $(INCLUDES_FILE_OF_MINE)
    13 LOCAL_CXX_INCLUDES := $(INCLUDES_FILE_OF_MINE)
    14 LOCAL_SRC_FILES := $(SRC_FILE_OF_MINE)
    15 LOCAL_STATIC_LIBRARIES :=$(STATIC_LIBRARIES_OF_MINE)
    16 include $(BUILD_STATIC_LIBRARY)

    先介绍两个小常识:$表示引用,比如上面写到的$(LOCAL_PATH)表示的意思就是使用LOCAL_PATH的值;../表示的是当前目录的上一级目录;字符表示换行的意思;上面写到的后面有OF_MINE的那几个东西是自己定义的变量,这个变量定义是由编程人员决定,大多数人喜欢以MY_开头,这个看个人喜好

    LOCAL_PATH:=$(call my-dir)这个是确定当前的目录。my-dir是系统定义的,获取的是当前你这个android.mk文件所在的路径,当然也可以自己指定;

    include $(CLEAR_VARS):猜大概可以猜出他的意思clear variables,清楚变量,但是要注意的是,他清除的是除LOCAL_PATH以外的变量;

    SRC_FILEOF_MINE:上面提到了,这个是自己定义的一个变量

    LOCAL_CFLAGS:这个东西,如果只是自己写了个简单的程序要生成库,一般不用他。他的作用在于可以决定库在编译时编译代码里的那一部分,真正的实现代码在不同平台上选择正确的代码进行编译。举个例子,加入我有这样一段代码#ifdef USE #include"amethod.h" #endif,那么我只要在mk文件里写一句LOCAL_CFLAGS:=-DUSE 那么在生成库时就会执行#include"amethod.h"这段代码;

     LOCA_C_CINCLUDE:这个指明你的编译时如果遇到不认识的头文件,应该在什么路径下面找

    COCAL_CXX_INCLUDE:这个我不打清楚,好像也是来找头文件的,但是和上面的什么区别呢?个人感觉应该是上面那个找c的头文件,下面这个找c++的头文件。这个我不大清楚

    LOCAL_SRC_FILES:这个致命要编译的源文件;

    LOCAL_STATIC_LIBRARIES:这个指明要生成的库需要依赖的其他的静态库;把中间的STATIC换成SHARED就是动态库;

    include(BUILD_STATIC_LIBRARY):生成静态库,把STATIC改成SHARED就是动态库。

    接下来介绍一下如何使用第三方库:

    首先卖弄一下:整个程序,或者库的生成顺序:

    首先是编译,编译阶段程序执行语法检查,并不注意你代码这种功能的实现。比如你要用一个函数,名字叫fun(),如果你仅仅是是生命了一下,并没有给出这个函数的实现,接着就开始使用这个函数了,那么程序编译是没有问题的。那么什么时候有问题呢。连接时!连接时电脑会去找你各个函数的具体实现,如果找不到就会报错。找得到那么就可以顺利生成库或者可执行程序。接下来是重点,如何待用第三方库:

    答案:使用prebuilt。比如我有一个库libopencv_java.so(这个是opencv中的一个动态库),我在我的程序中需要调用它,那么我可以这样做:

    首先在jni目录下建立一个folder。命名为prebuilt。然后将libopencv_java.so复制到这个文件夹中,接着就是写mk文件了:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE:=opencv_java
    LOCAL_SRC_FILES:=libopencv_java.so
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE:=opencv_info
    LOCAL_SRC_FILES:=libopencv_info.so
    include $(PREBUILT_SHARED_LIBRARY)
    

    就是这个样子,就成功的将他的so库转化成了你的动态库,如果要想用静态库的话只要将最后一句中的shared改成static就好了。然后,我们如何调用呢?我们需要把相应的头文件放进来,就放到prebuilt文件夹下面就好了,然后在其他地方指明头文件查找路径就可以只用了。

    ======================================================

    ===== 初学者,未深入研究,个人理解,如有错误,望指正,莫见怪!=============

    ======================================================

  • 相关阅读:
    装饰器的加载顺序
    生成器
    迭代器
    有参装饰器与装饰器补充
    无参装饰器
    闭包函数
    函数对象与函数嵌套
    名称空间与作用域
    函数参数补充
    函数参数的使用
  • 原文地址:https://www.cnblogs.com/guanking19/p/4262237.html
Copyright © 2020-2023  润新知