zoukankan      html  css  js  c++  java
  • 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文件夹下面就好了,然后在其他地方指明头文件查找路径就可以只用了。

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

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

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

  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/guanking19/p/4262237.html
Copyright © 2011-2022 走看看