jni使用基础(三)之Android.mk文件详解

 

 

Android.mk文件详细说明:

LOCAL_PATH:=$(call my-dir)//调用编译链的函数

LOCAL_PATH是定义源文件在哪个目录用的.

my-dir 是个定义的宏方法,

 $(call my-dir)就是调用这个叫 my-dir的宏方法,这个方法返回值就是Android.mk文件所在的目录

 

include $(CLEAR_VARS)//类似工具的初始化操作

CLEAR_BARS 变量是build system里面的一个变量
这个变量指向了所有的类似 LOCAL_XXX的变量,
执行完这一句话, 这个编译系统就把 所有的类似
LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,...这样的变量都清除掉
但是不会清除掉 LOCAL_PATH

 

LOCAL_MODULE  就是你要生成的库的名字,这个名字要是唯一的.不能有空格.
编译后系统会自动在前面加上lib的头, 比如说我们的Hello 就编译成了libHello.so

还有个特点就是如果你起名叫libHello 编译后ndk就不会给你的module名字前加上lib了

但是你最后调用的时候 还是调用Hello这个库

 

LOCAL_SRC_FILES = :Hello.c  //(当有多个c文件,以“,”分隔开)
这个是指定你要编译哪些文件
不需要指定头文件 ,引用哪些依赖, 因为编译器会自动找到这些依赖 自动编译

include $(BUILD_SHARED_LIBRARY) //告诉编译器编译出来的库文件是一个动态库

                BUILD_STATIC_LIBRARY   //静态库编译参数

.so编译后生成的库的类型,

如果是静态库.a 配置include $(BUILD_STATIC_LIBRARY)

别的参数

LOCAL_CPP_EXTENSION := cc //指定c++文件的扩展名
LOCAL_MODULE    := ndkfoo
LOCAL_SRC_FILES := ndkfoo.cc

LOCAL_LDLIBS += -llog -lvmsagent -lmpnet -lmpxml -lH264Android
//指定需要加载一些别的什么库.

动态库和静态库的区别:

  动态库的体积会比较小,是以.so为扩展名

   静态库的体积比较大,是以.a为扩展名

大小原因:动态库里面只包含的它运行所依赖的一些环境的配置信息,也就是它在运行的时候,

                   它会动态的从操作系统中,根据配置信息获取它运行所需的内容

                   静态库被编译后,它所有依赖的文件,都加入到编译后的.a文件中了。

 

所以,在使用动态库的时候,如果手机中没有支持动态库所需的内容时,就无法使用

           so文件,而静态库是不需要关心平台问题,它不需要去系统中找相应的引用文件。

 

 

时间: 2024-10-28 08:44:50

jni使用基础(三)之Android.mk文件详解的相关文章

详解安卓系统中的Android.mk文件_C 语言

概述    Android.mk文件用来向编译系统描述如何编译你的源代码.更确切地说,该文件其实就是一个小型的Makefile.由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量,因为这些变量可能会被多次定义从而影响到后面的解析.这个文件的语法允许把源代码组织成模块,每个模块属于下列类型之一:     APK程序:一般的Android程序,编译打包生成apk文件.     JAVA库:java类库,编译打包生成jar包文件.     C\C++应用程序:可执行的C/C++应用

Android的Manifest文件详解

Manifest可以定义应用程序及其组件和需求的结构和元数组. Android的文档: http://developer.android.com/guide/topics/manifest/manifest-element.html Hello_World, AndroidManifest.xml : <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http:

02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译

 1  编写以下案例(下面的三个按钮都调用了底层的C语言): 项目案例的代码结构如下: 2 编写DataProvider的代码: package com.example.ndkpassdata;   public class DataProvider {         /**      * 计算x和y的加法  apktools      *      * @param x      * @param y      * @return      */     public native in

Android.mk文件写法及错误提示原因分析

//根据文档中的提示创建的Android.mk中的文本  代码如下 复制代码 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := crypt //这里是库名 LOCAL_SRC_FILES := crypt.c //这里是库源码文件名 include $(BUILD_SHARED_LIBRARY) 当我写错了这个android.mk文件的时候报了一个"LOCAL_MODULE_FILENAME must not c

Android Studio 插件开发详解三:翻译插件实战

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 一:概述 如果不了解插件开发基础的同学可以先看, Android Studio 插件开发详解一:入门练手 Android Studio 插件开发详解二:工具类 在上面的两篇文章,讲解了插件开发的基础,今天就来一个优点难度的项目,插件的名字叫 AndroidPluginTranslate , 顾名思义就是可以翻译文案的插件,废话不多说,先看最

《Java和Android开发实战详解》——1.1节编程语言基础知识

1.1编程语言基础知识 Java和Android开发实战详解 "编程语言"(Programming Language)是人类告诉计算机如何工作的一款语言,如同人与人之间沟通使用自然语言,编程语言被设计用于人类与计算机之间进行沟通.从技术角度来说,编程语言就是一款将执行指令传达给计算机的标准通信技术. 1.1.1 程序.软件与应用程序 在说明编程语言之前,我们需要了解什么是程序.软件与应用程序.简单地说来,编程语言提供了语法,可以让我们编写程序代码来建立程序,程序经编译建立成应用程序后,

《Java和Android开发实战详解》——1.2节Java基础知识

1.2 Java基础知识 Java和Android开发实战详解 Java语言类似于C++是一种编译型语言,不过两者并不完全相同,严格说来,Java是结合编译和解释优点的一种编程语言. 1.2.1 Java平台 "平台"(Platform)是一种结合硬件和软件的执行环境.Java既是一种高级的面向对象的编程语言,也是一个平台.Java平台是一种纯软件平台,它可以在各种基于硬件的平台上运行,与硬件无关,主要是由JVM和Java API两个部分组成. 1.JVM虚拟机 JVM(Java Vi

《Android游戏开发详解》一2.8 对象的基础知识

2.8 对象的基础知识 Android游戏开发详解 我们已经应用了第1章中介绍过的概念来编写和运行一些非常简单的Java程序.接下来,我们将把注意力转向对象,它使得我们能够编写更加复杂和强大的程序. 什么是对象?以你看待现实世界中的物体的方式来思考Java对象,这么做是有帮助的.对象所拥有的属性,我们称之为状态(state)和行为(behavior). 让我们以手机为例子.你的手机拥有状态,它可能是黑色的,并且可能打开了电源开关.这些属性可以帮助我们描述手机以形成其状态.手机还会有行为.它可能能

《Android游戏开发详解》——第2章,第2.8节对象的基础知识

2.8 对象的基础知识Android游戏开发详解我们已经应用了第1章中介绍过的概念来编写和运行一些非常简单的Java程序.接下来,我们将把注意力转向对象,它使得我们能够编写更加复杂和强大的程序. 什么是对象?以你看待现实世界中的物体的方式来思考Java对象,这么做是有帮助的.对象所拥有的属性,我们称之为状态(state)和行为(behavior). 让我们以手机为例子.你的手机拥有状态,它可能是黑色的,并且可能打开了电源开关.这些属性可以帮助我们描述手机以形成其状态.手机还会有行为.它可能能够播