android.mk详解 android NDK从入门到精通

合集下载

androidmk 用法

androidmk 用法

androidmk 用法Android.mk 是Android 系统中的一个构建脚本文件,用于编译和构建Android 应用程序。

在这篇文章中,我们将一步一步地介绍Android.mk 的用法和如何使用它来构建Android 应用程序。

第一步:了解Android.mk 的基本语法和结构Android.mk 是使用GNU make 工具的一个Makefile 脚本文件。

它使用一种特定的语法和结构来定义构建规则和目标。

首先,我们需要了解Android.mk 文件的基本结构。

在Android.mk 文件中,通常需要包含一些变量定义和目标规则。

变量定义用于定义一些常用的路径、选项和编译器标志等。

目标规则用于指定构建目标,并描述如何构建它们。

下面是一个简单的Android.mk 文件的示例:LOCAL_PATH := (call my-dir)include (CLEAR_VARS)LOCAL_MODULE := MyApplicationLOCAL_SRC_FILES := MyApplication.cppinclude (BUILD_SHARED_LIBRARY)在这个示例中,`LOCAL_MODULE` 定义了要构建的模块的名称,`LOCAL_SRC_FILES` 定义了要编译的源代码文件。

`LOCAL_PATH` 变量用于指定当前Android.mk 文件所在的路径。

`include (CLEAR_VARS)` 和`include (BUILD_SHARED_LIBRARY)` 用于包含一些预定义的变量和规则。

第二步:定义编译选项和路径在Android.mk 文件中,可以定义一些编译选项和路径,以便在构建过程中使用。

例如,可以定义包含文件路径、库路径、编译器标志等。

LOCAL_C_INCLUDES := (LOCAL_PATH)/includeLOCAL_LDLIBS := -lm在这个示例中,`LOCAL_C_INCLUDES` 定义了包含文件的路径,`LOCAL_LDLIBS` 定义了要链接的库。

androidNDK

androidNDK

现在可以看到jni目录下多了个.h文件:
braincol@ubuntu:~/workspace/android/NDK/hello-jni$ cd jni/
braincol@ubuntu:~/workspace/android/NDK/hello-jni/jni$ ls
com_example_hellojni_HelloJni.h
这段代码很简单,注释也很清晰,这里只提两点::
static{
System.loadLibrary("hello-jni");
}
表明程序开始运行的时候会加载hello-jni, static区声明的代码会先于onCreate方法执行。如果你的程序中有多个类,而且如果HelloJni这个类不是你应用程序的入口,那么hello-jni(完整的名字是libhello-jni.so)这个库会在第一次使用HelloJni这个类的时候加载。
二、代码的编写
1.首先是写java代码
建立一个Android应用工程HelloJni,创建HelloJni.java文件:
HelloJni.java :
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * /licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.hellojni;import android.app.Activity;import android.widget.TextView;import android.os.Bundle;public class HelloJni extends Activity{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Create a TextView and set its content. * the text is retrieved by calling a native * function. */ TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); } /* A native method that is implemented by the * 'hello-jni' native library, which is packaged * with this application. */ public native String stringFromJNI(); /* This is another native method declaration that is *not* * implemented by 'hello-jni'. This is simply to show that * you can declare as many native methods in your Java code * as you want, their implementation is searched in the * currently loaded native libraries only the first time * you call them. * * Trying to call this function will result in a * ng.UnsatisfiedLinkError exception ! */ public native String unimplementedStringFromJNI(); /* this is used to load the 'hello-jni' library on application * startup. The library has already been unpacked into * /data/data/com.example.HelloJni/lib/libhello-jni.so at * installation time by the package manager. */ static { System.loadLibrary("hello-jni"); }}

AndroidNDK开发指南

AndroidNDK开发指南

AndroidNDK开发指南Android NDK开发指南第一章:介绍Android NDKAndroid NDK(Native Development Kit)是一个用于开发Android应用程序的工具集。

它提供了一组与平台无关的原生C/C++库以及一组工具,可以帮助开发者在Android应用程序中使用C/C++代码编写高性能的本地代码。

本章将介绍Android NDK的概述,包括其背景、目的以及与传统Java开发的区别。

同时还将介绍使用Android NDK的优势和适用场景。

第二章:Android NDK环境搭建要开始使用Android NDK进行开发,首先需要搭建相应的开发环境。

本章将详细介绍如何在Android Studio中配置NDK开发环境,包括下载和安装NDK工具链、配置Gradle构建文件以及设置NDK路径等。

第三章:Android NDK开发基础在进行Android NDK开发之前,需要了解一些基本概念和核心知识。

本章将介绍如何编写和构建C/C++代码,如何与Java层进行交互,以及如何处理线程和内存管理等重要方面。

第四章:使用Android NDK调用系统API在Android NDK中,可以直接调用系统提供的原生API,以实现更底层的功能。

本章将介绍如何使用Android NDK调用系统API,包括访问传感器、相机、音频、网络等硬件和系统服务。

第五章:优化Android NDK代码性能Android NDK提供了一系列优化工具和技术,可以帮助开发者提升代码性能。

本章将介绍如何使用NDK的调试工具、性能分析工具和优化技术,以及在设计和编写代码时应注意的性能问题。

第六章:使用第三方库进行Android NDK开发Android NDK还支持使用第三方库进行开发,这些库可以提供更多的功能和便利性。

本章将介绍如何集成和使用常见的第三方库,比如OpenCV、FFmpeg、SQLite等,以及相应的配置和调用方法。

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

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

详解安卓系统中的Android.mk⽂件概述Android.mk⽂件⽤来向编译系统描述如何编译你的源代码。

更确切地说,该⽂件其实就是⼀个⼩型的Makefile。

由于该⽂件会被NDK的编译⼯具解析多次,因此应该尽量减少源码中声明变量,因为这些变量可能会被多次定义从⽽影响到后⾯的解析。

这个⽂件的语法允许把源代码组织成模块,每个模块属于下列类型之⼀:APK程序:⼀般的Android程序,编译打包⽣成apk⽂件。

JAVA库:java类库,编译打包⽣成jar包⽂件。

C\C++应⽤程序:可执⾏的C/C++应⽤程序。

C\C++静态库:编译⽣产C/C++静态库,并打包成.a⽂件。

C\C++共享库:编译⽣成共享库,并打包成.so⽂件,有且只有共享库才能被安装/复制到APK包中。

举例这⾥参考了⽹上⼀个通⽤的例⼦,编译简单的“Hello World”,来说明⼀下Android.mk编写。

例如下⾯的⽂件:1. sources/test/hello.c2. sources/test/Android.mk其中“hello.c”是⼀个JNI共享库,实现返回“hello world”字符串的原⽣⽅法。

因此,Android.mk⽂件内容如下:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := helloLOCAL_SRC_FILES := hello.cinclude $(BUILD_SHARED_LIBRARY)解释⼀下这⼏⾏代码:1. LOCAL_PATH := $(call my-dir) :⼀个Android.mk⽂件⾸先必须定义好LOCAL_PATH变量,⽤于在开发树中查找源⽂件。

在这个例⼦中,宏函数my-dir由编译系统提供,⽤于返回当前路径(即包含Android.mk⽂件的⽬录)。

2. include $(CLEAR_VARS):CLEAR_VARS由编译i系统提供,指定让GNU MAKEFILE清除除了LOCAL_PATH变量外的许多LOCAL_***变量(例如:LOCAL_MODULE、LOCAL_SRC_FILES等)。

详解AndroidJNI的基本使用(CMake)

详解AndroidJNI的基本使用(CMake)

详解AndroidJNI的基本使⽤(CMake)简介什么是JNIJNI的全称是Java Native Interface:Java本地开发接⼝,它提供了若⼲的API实现了Java和其他语⾔的通信(主要是C和C++),⽬的就是Java可以调⽤C或C++开发的函数,C或C++也能调⽤Java的⽅法。

这样有很多有点,其⼀就是效率,C/C++是本地语⾔,⽐java更⾼效;其⼆就是可以复⽤已经存在的C/C++代码;其三是Java反编译⽐C语⾔容易,⼀般加密算法都是⽤C语⾔编写,不容易被反编译。

什么是NDK和CMakeNDK全称是Native Development Kit,NDK提供了⼀系列的⼯具,帮助开发者快速开发C(或C++)的动态库,并能⾃动将so和Java应⽤⼀起打包成apk。

NDK集成了交叉编译器,并提供了相应的mk⽂件隔离CPU、平台、ABI等差异,开发⼈员只需要简单修改mk⽂件(指出“哪些⽂件需要编译”、“编译特性要求”等),就可以创建出so。

CMake是⼀个⽐make更⾼级的编译配置⼯具,它可以根据不同平台、不同的编译器,⽣成相应的Makefile或者vcproj项⽬。

通过编写CMakeLists.txt,可以控制⽣成的Makefile,从⽽控制编译过程。

CMake⾃动⽣成的Makefile不仅可以通过make命令构建项⽬⽣成⽬标⽂件,还⽀持安装(make install)、测试安装的程序是否能正确执⾏(make test,或者ctest)、⽣成当前平台的安装包(make package)、⽣成源码包(make package_source)、产⽣Dashboard显⽰数据并上传等⾼级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试⽤例。

如果有嵌套⽬录,⼦⽬录下可以有⾃⼰的CMakeLists.txt。

使⽤流程1、在java⽂件中创建本地⽅法2、build项⽬后⾃动⽣成“.h”⽂件3、创建.cpp⽂件,实现.h⽂件中的⽅法4、配置Cmake⽂件,⽣成“.so”⽂件笔者项⽬⽬录如下:测试实例public class MyJNI {private static final String TAG=MyJNI.class.getName();@Testpublic void test(){JNITest jniTest=new JNITest();Log.d(TAG,jniTest.nativeCalculate(2)+"");}}1、调⽤native⽅法nativeCalculate,传⼊参数2。

Android应用开发从入门到精通

Android应用开发从入门到精通

Android应用开发从入门到精通第一章:介绍Android应用开发的基础概念Android应用开发是指基于Android操作系统平台开发的移动应用程序。

Android是一个基于Linux的开放源代码平台,它提供了强大的开发工具和丰富的API(应用程序接口),使开发者能够创建各种各样的应用程序,包括游戏、社交媒体、电子商务和工具类应用等。

Android应用开发的核心概念包括Activity、Fragment、布局文件、资源文件、Intent等。

Activity是Android应用的主要组件,每个Activity代表了应用的一个界面。

Fragment是一个可重用的界面组件,可以在Activity中动态加载和替换。

布局文件定义了Activity或Fragment中的界面元素的排列方式,可以使用XML语言编写。

资源文件包括图片、字符串、颜色等,用于应用的各种资源的管理。

Intent用于在不同的组件之间进行通信和传递数据。

第二章:Android应用开发环境的搭建要进行Android应用开发,需要搭建相应的开发环境。

首先,需要下载并安装Java Development Kit(JDK),然后下载并安装Android Studio,它是官方推荐的Android开发工具。

安装完Android Studio后,需要配置Android SDK(软件开发工具包)。

Android SDK包含了众多的开发工具和API,可以满足不同应用的需求。

配置SDK的过程通常包括选择需要安装的组件和设置相应的环境变量。

安装完成后,就可以开始进行Android应用的开发了。

第三章:Android应用的UI设计用户界面(UI)是Android应用的重要组成部分,好的UI设计能够提高用户体验。

Android提供了丰富的UI元素和布局管理器,开发者可以根据应用的需求自由选择和设计UI。

常用的UI元素包括文本框、按钮、图像视图、列表视图等。

Android提供了一套用于绘制和交互的UI组件,开发者可以通过XML文件或者代码方式来创建UI界面。

Android编译系统(Android.mk文件详解)

Android编译系统(Android.mk文件详解)

Android编译系统(Android.mk⽂件详解)【Android-NDK(Native Development Kit) docs⽂档】NDK提供了⼀系列的⼯具,帮助开发者快速开发C(或C++)的动态库,并能⾃动将so和java应⽤⼀起打包成apk。

Android.mk⽂件是GNU Makefile的⼀⼩部分,它⽤来对Android程序进⾏编译。

因为所有的编译⽂件都在同⼀个 GNU MAKE 执⾏环境中进⾏执⾏,⽽Android.mk中所有的变量都是全局的。

因此,您应尽量少声明变量,不要认为某些变量在解析过程中不会被定义。

⼀个Android.mk⽂件可以编译多个模块,每个模块属下列类型之⼀:1)APK程序⼀般的Android程序,编译打包⽣成apk⽂件2)JAVA库java类库,编译打包⽣成jar⽂件3)C\C++应⽤程序可执⾏的C\C++应⽤程序4)C\C++静态库编译⽣成C\C++静态库,并打包成.a⽂件5)C\C++共享库编译⽣成共享库(动态链接库),并打包成.so⽂,有且只有共享库才能被安装/复制到您的应⽤软件(APK)包中。

可以在每⼀个Android.mk file 中定义⼀个或多个模块,你也可以在⼏个模块中使⽤同⼀个源代码⽂件。

编译系统为你处理许多细节问题。

例如,你不需要在你的 Android.mk 中列出头⽂件和依赖⽂件。

编译系统将会为你⾃动处理这些问题。

这也意味着,在升级 NDK 后,你应该得到新的toolchain/platform⽀持,⽽且不需要改变你的 Android.mk ⽂件。

注意,NDK的Anroid.mk语法同公开发布的Android平台开源代码的Anroid.mk语法很接近,然⽽编译系统实现他们的⽅式却是不同的,这是故意这样设计的,可以让程序开发⼈员重⽤外部库的源代码更容易。

在描述语法细节之前,咱们来看⼀个简单的"hello world"的例⼦,⽐如,下⾯的⽂件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是⼀个 JNI 共享库,实现返回"hello world"字符串的原⽣⽅法。

Android NDK 编译脚本分析 之一

Android NDK 编译脚本分析 之一

Android NDK 编译脚本分析之一版权信息:本文为本人原创,欢迎转载,但请著明出处,并保留本版权信息。

Android NDK编译脚本编写起来还是是比较简单条理的,然而它的语法和传统的linux GNU Make编译脚本的编写似乎有很大的不同,这让习惯了GNU Makefile的用户很不习惯。

有许多人会用它,但对其工作原理却不理解,笔者甚至一度误认为那是一套全新脚本语言。

我将在后文中对这一编译管理系统做一些分析,试着分析一下它和传统GNU Makefile的关系。

本文假设您已经拥有Linux命令和GNU Makefile的基础知识,当然您也可以边阅读,边查找参考相关的知识。

参考资料2是徐海兵先生整理的GNU Makefile 中文手册,推荐英文不太好的朋友拿来作为参考。

这篇文章是对自己前段时间所学知识的一个记录整理,以期与大家互相交流,希望朋友们不要吝于来信,指出本文的错漏之处或者你们不同理解(绝非客气,真的期望能收到您的信件,我的邮箱techres# ,请把# 换成@ )。

============================================ ========================Android NDK 的编译脚本系统,实际上并不是什么新东西,就是对GNU MakeFile 系统的封装。

Android NDK 自带了很多 .mk 文件(保存在ndk的NDK_ROOT/build 目录中),文件中预定义了很多Make 脚本函数和变量,以供用户编写自己的编译脚本时使用。

另外,NDK为所有应用统一提供了一个固定的编译入口--即大家熟悉的ndk-build。

我们首先从每个应用编译时都需要用到的编译入口开始分析。

一、ndk-build分析(一)、脚本内容分析该文件存在于ndk安装根目录中,实际上是一个shell 脚本。

其有效内容如下:PROGDIR=`dirname $0`PROGDIR=`cd $PROGDIR && pwd`# If GNUMAKE is defined, check that it points to a valid fileif [ -n "$GNUMAKE" ] ; thenABS_GNUMAKE=`which $GNUMAKE 2> /dev/null` if [ $? != 0 ] ; thenecho "ERROR: Your GNUMAKE variable is defined to an invalid name: $GNUMAKE"echo "Please fix it to point to a valid make executable (e.g. /usr/bin/make)"exit 1fiGNUMAKE="$ABS_GNUMAKE"else# Otherwise, use 'make' and check that it is available GNUMAKE=`which make 2> /dev/null`if [ $? != 0 ] ; thenecho "ERROR: Cannot find 'make' program. Please install Cygwin make package"echo "or define the GNUMAKE variable to point to it."exit 1fifi# On Windows, when running under cygwin, check that we are# invoking a cygwin-compatible GNU Make binary. It is unfortunately# common for app developers to have another non-cygwin compatible#if [ "$OSTYPE" = "cygwin" ] ; thenGNUMAKE=`cygpath -u $GNUMAKE`PROGDIR_MIXED=`cygpath -m $PROGDIR`CYGWIN_GNUMAKE=`$GNUMAKE -f$PROGDIR_MIXED/build/core/check-cygwin-make.mk2>&1`if [ $? != 0 ] ; thenecho "ERROR: You are using a non-Cygwin compatible Make program."echo "Currently using: `cygpath -m $GNUMAKE`"echo ""echo "To solve the issue, follow these steps:"echo ""echo "1. Ensure that the Cygwin 'make' package is installed."echo " NOTE: You will need GNU Make 3.81 or later!"echo ""echo "2. Define the GNUMAKE environment variable to point to it, as in:"echo ""echo " export GNUMAKE=/usr/bin/make"echo ""echo "3. Call 'ndk-build' again."echo ""exit 1fifi$GNUMAKE -f $PROGDIR/build/core/build-local.mk "$@" 下面我们对这些有效代码逐一进行分析:PROGDIR=`dirname $0`PROGDIR=`cd $PROGDIR && pwd` 在GNU makefile中,两个反引号相当于shell 函数,反引号括起来的内容相当于shell 函数的参数。

android使用mk文件的进阶

android使用mk文件的进阶

android使用mk文件的进阶最近在搞android上的rtmp协议的播放,将ffmpeg编译成几个.so动态链接库之后(后面再说如何在android下编译ffmpeg 源代码),就可以引用头文件并直接写自己的jni接口了,做完这些,就可以写android下的make文件了下面就介绍一下androidmake文件的写法。

首先最简单的mk文件可以参照ndk目录下samples目录中的hello-jni工程,这里讲讲如何在mk文件中引用第三方的动态和静态库以及如何引用系统库(其实我是linux小白,有说错的地方请指教)LOCAL_PATH := $(call my-dir)//标准mk语句,指编译路径,所有mk文件第一句都是这个/**这个模块表示引用了一个本地的静态库include $(CLEAR_VARS) //清除各种变量,因为这些变量是静态全局的,如果清除,下次编译时又会用到这些变量造成出错LOCAL_MODULE := libopencore-amrnb //本地静态库模块的名字,这个名字在下面编译jni时需要引用LOCAL_SRC_FILES := lib/libopencore-amrnb.a //本地静态库文件地址include $(PREBUILT_STATIC_LIBRARY) //PREBUILT_STATIC_LIBRARY表示先build一个静态库**//**这个模块表示引用了一个本地的动态链接库include $(CLEAR_VARS) //同上LOCAL_MODULE := libswscale //本地动态库模块的名字LOCAL_SRC_FILES := lib/libswscale.so //本地动态库文件位置include $(PREBUILT_SHARED_LIBRARY) //表示先build这个动态链接库**/include $(CLEAR_VARS)LOCAL_MODULE := libavutilLOCAL_SRC_FILES := lib/libavutil.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := libavcoreLOCAL_SRC_FILES := lib/libavcore.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := libavcodecLOCAL_SRC_FILES := lib/libavcodec.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := libavformatLOCAL_SRC_FILES := lib/libavformat.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE := libopenalLOCAL_SRC_FILES := lib/libopenal.soinclude $(PREBUILT_SHARED_LIBRARY)/**此模块编译自己写的jni文件include $(CLEAR_VARS)LOCAL_MODULE := ffmpeg-jni 模块名字LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include //我将所有头文件都放到了jni目录的include目录下,这句表示所有引用头文件都到这个目录下去找LOCAL_SRC_FILES := ../../test-ffmpeg-jni/ffmpeg-jni.c \ //这句表示jni文件的位置,因为我装了一个CDT插件去开发c代码,所以将jni文件都放在了另一个test-ffmpeg-jni工//程下,其中../表示上级目录../../test-ffmpeg-jni/openal.c \../../test-ffmpeg-jni/opengl.cppLOCAL_SHARED_LIBRARIES := libavformat libavcodec libavutil libswscale openal //这个表示编译本模块需要用到的其它库,这几个名字都是前面定义的模块名LOCAL_STATIC_LIBRARIES := libopencore-amrnb //同上LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lGLESv2//表示使用了系统的log库和GLESv2库include $(BUILD_SHARED_LIBRARY) //注意与前面的不同之处。

NDK的详细说明-来自官网

NDK的详细说明-来自官网

Android NDK是一套工具,允许Android应用开发者嵌入从C和/或C + +源文件编译成自己的应用程序包本机代码。

重要提示:而Android NDK只能用于目标运行蛋糕(又名1.5)或更高版本的平台的Android系统映像。

1.0和1.1系统映像是专门不因细微的ABI和发生的1.5版本的工具链支持的变化。

一,Android的NDK目标:Android的虚拟机可以让您的应用程序的源代码来调用通过JNI实现本机代码的方法。

简而言之,这意味着:您的应用程序的源代码将宣布一个或多个方法的'本土'的关键字,以表明它们是通过本地代码实现的。

例如:原生的byte []的loadFile (字符串文件路径);你必须提供一个包含实施这些方法,这将被打包到应用程序的apk文件本机共享库。

这个库必须按照标准的Unix惯例被命名为lib.so ,并应包含一个标准的JNI入口点(后面将详细讨论)。

例如:libFileLoader.so您的应用程序必须显式地加载库。

例如,要加载它在应用程序启动时,只需添加以下到它的源代码:静态{System.loadLibrary (“FileLoader ”);}请注意,您不应该使用'解放'前缀和'所以'后缀在这里。

而Android NDK是一个补充,Android SDK中,可以帮助你:生成可以在Android 1.5平台上运行(和更高版本)在ARM CPU上运行JNI兼容的共享库。

生成的共享库复制到您的应用程序项目路径的正确位置,所以它们将被自动添加到您的最终(和符号)。

的apk在NDK的后续版本,我们希望能提供工具,帮助通过远程的gdb连接和尽可能多的源/符号信息尽可能调试您的本机代码。

此外,在Android NDK提供:一组交叉工具链(编译器,链接器等),可以产生在Linux,OS X和Windows原生的ARM二进制文件(使用Cygwin )一组对应的Android平台支持的稳定的原生API名单制头。

Android.mk文件详解(转)

Android.mk文件详解(转)

Android.mk⽂件详解(转)源:从对Makefile⼀⽆所知开始,折腾了⼀个多星期,终于对Android.mk有了⼀个全⾯些的了解。

了解了标准的Makefile后,发现Android.mk其实是把真正的Makefile包装起来,做成了⼀个对使⽤者来说很简单的东西。

使⽤它来编译程序时,不管是动态库、可执⾏的⼆进制⽂件,还是Jar库、APK包,只要沿着⼀个简单的思路来做三⼤步就可以了:清除旧变量,设置新变量,调⽤编译函数。

明⽩了以后,发现Makefile语法不是问题,有很多教程和⾼⼿。

编译模块时如何清除变量、调⽤编译函数等也不是问题,源码当中⽆处不在这样的例⼦。

⽽对初学者来说,更需要明⽩的可能是,Android如何让使⽤脚本的⼈从Makefile语法当中解放出来,简单地按照上⾯的三⼤步就可以编译出任何模块。

拿AlarmClock来做例⼦的话://清除旧变量LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)//设置新变量LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := AlarmClock//调⽤编译函数include $(BUILD_PACKAGE)下⾯简单解释⼀下这三步:1、清除旧变量,是因为Android.mk中所有的变量都是全局的,编译函数在编译时会调⽤这些变量。

为了防⽌编译函数使⽤了编译其它模块时设置的变量,每次开始编译⼀个新的模块时清除所有的变量是个好习惯。

2、设置新变量就是把本次编译时⽤到的源码地址,包名等设置好。

3、调⽤编译函数其实就是include⼀个固定的mk⽂件,这个mk⽂件会根据设置的变量提取出编译模块需要的target,Command等信息并执⾏固定的编译命令。

看明⽩Android.mk后,最深的感受还是Android的这种封装思想,让我想起了很多以前没有思考过的东西。

Android.mk详解-CSDN博客

Android.mk详解-CSDN博客

Android.mk详解-CSDN博客展开全文Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a 静态库文件等。

要掌握jni,就必须熟练掌握Android.mk的语法规范。

一、Android.mk文件的用途一个android子项目中会存在一个或多个Android.mk文件1、单一的Android.mk文件直接参考NDK的sample目录下的hello-jni项目,在这个项目中只有一个Android.mk文件2、多个Android.mk文件如果需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:include $(call all-subdir-makefiles)只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件3、多个模块共用一个Android.mk这个文件允许你将源文件组织成模块,这个模块中含有:-静态库(.a文件)-动态库(.so文件)只有共享库才能被安装/复制到您的应用软件(APK)包中include $(BUILD_STATIC_LIBRARY),编译出的是静态库include $(BUILD_SHARED_LIBRARY),编译出的是动态库二、自定义变量以下是在Android.mk中依赖或定义的变量列表,可以定义其他变量为自己使用,但是NDK编译系统保留下列变量名:-以 LOCAL_开头的名字(例如 LOCAL_MODULE)-以 PRIVATE_, NDK_ 或 APP_开头的名字(内部使用)-小写名字(内部使用,例如‘my-dir’)如果为了方便在 Android.mk 中定义自己的变量,建议使用 MY_前缀,一个小例子:MY_SOURCES := foo.cifneq ($(MY_CONFIG_BAR),)MY_SOURCES += bar.cendifLOCAL_SRC_FILES += $(MY_SOURCES)注意:‘:=’是赋值的意思;'+='是追加的意思;‘$’表示引用某变量的值。

【NDK开发】01、NDK开发笔记—Android.mk详解

【NDK开发】01、NDK开发笔记—Android.mk详解
所以,整行代码的意思,就是告诉构建系统,帮我构建出一个动态库吧。"$(BUILD_SHARED_LIBRARY)"它负责收集从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息,并指定构建一个动态库。注意,调用"include $(BUILD_SHARED_LIBRARY)"前,至少应该包 含:"LOCAL_MODULE"和"LOCAL_SRC_FILES"。
4、指定源文件
看下面这一行代码:
LOCAL_SRC_FILES := native-lib.cpp "LOCAL_SRC_FILES "是系统定义的变量,用于指定构建目标所需要的源文件,可以指定多个;
整行代码的意思是告诉构建系统,需要将哪些源文件加入到构建中。"LOCAL_SRC_FILES "可以指定多定多个文件,用空格或Tab隔开,如 下:
LOCAL_SRC_FILES := $(LOCAL_PATH)/ffmpeg/lib/libavutil.a
include $(PREBUILT_STATIC_LIBRARY) "include $(CLEAR_VARS)"这行语句前面已经说过了,用途是清理除"LOCAL_PATH"之外所有以"LOCAL_"开头的系统变量; "LOCAL_MODULE"用于指定库的名称,在后面引用的时候,就用这个名称; "LOCAL_SRC_FILES"用于指定库的源文件,可以是.a文件,也可以是若干.cpp或.c文件 "$(TARGET_ARCH_ABI)"是构建系统提供的变量,与构建目标架构相关,当构建"armeabi"是,该值为"armeabi",当构建"armeabiv7a"是,该值为"armeabi-v7a",x86类似。 "include $(PREBUILT_STATIC_LIBRARY)"这是关键,"PREBUILT_STATIC_LIBRARY"是构建系统提供的变量,指向一个makefile文件 ((NDK_ROOT)build/core/prebuilt-static-library.mk),该makefile文件会收集"include $(CLEAR_VARS)"之后,"include $(PREBUILT_STATIC_LIBRARY)"之前的所有"LOCAL_"变量信息,并预编译一个静态库。

Android.mk文件官方使用说明

Android.mk文件官方使用说明

Android.mk⽂件官⽅使⽤说明本页介绍了ndk-build所使⽤的Android.mk编译⽂件的语法。

概览Android.mk⽂件位于项⽬jni/⽬录的⼦⽬录中,⽤于向编译系统描述源⽂件和共享库。

它实际上是编译系统解析⼀次或多次的微⼩ GNU makefile ⽚段。

Android.mk⽂件⽤于定义、编译系统和环境变量所未定义的项⽬范围设置。

它还可替换特定模块的项⽬范围设置。

Android.mk的语法⽀持将源⽂件分组为模块。

模块是静态库、共享库或独⽴的可执⾏⽂件。

您可在每个Android.mk⽂件中定义⼀个或多个模块,也可在多个模块中使⽤同⼀个源⽂件。

编译系统只将共享库放⼊您的应⽤软件包。

此外,静态库可⽣成共享库。

除了封装库之外,编译系统还可为您处理各种其他事项。

例如,您⽆需在Android.mk⽂件中列出头⽂件或⽣成的⽂件之间的显式依赖关系。

NDK 编译系统会⾃动计算这些关系。

因此,您应该能够享受到未来 NDK 版本中新⼯具链/平台⽀持带来的益处,⽽⽆需处理Android.mk⽂件。

此⽂件的语法与随整个分发的Android.mk⽂件中使⽤的语法⾮常接近。

虽然使⽤这些语法的编译系统实现并不相同,但通过有意将语法设计得相似,可使应⽤开发者更轻松地将源代码重复⽤于外部库。

基础知识在详细了解语法之前,最好先了解Android.mk⽂件所含内容的基本信息。

为此,本部分使⽤ Hello-JNI ⽰例中的Android.mk⽂件解释⽂件中每⼀⾏的作⽤。

Android.mk⽂件必须先定义LOCAL_PATH变量:LOCAL_PATH := $(call my-dir)此变量表⽰源⽂件在开发树中的位置。

在这⾏代码中,编译系统提供的宏函数my-dir将返回当前⽬录(Android.mk⽂件本⾝所在的⽬录)的路径。

下⼀⾏声明CLEAR_VARS变量,其值由编译系统提供。

include $(CLEAR_VARS)CLEAR_VARS变量指向⼀个特殊的 GNU Makefile,后者会清除许多LOCAL_XXX变量,例如LOCAL_MODULE、LOCAL_SRC_FILES和LOCAL_STATIC_LIBRARIES。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LOCAL_MODULE 是最后生成库时的名字的一部分, 给其加上前缀lib和后缀.so就是生成的共享库的名字 libhello-jni.so。
LOCAL_SRC_FILES 指明要被编译的c文件的文件名 include $(BUILD_SHARED_LIBRARY) 指明NDK编译时将 生成一些共享库,有需要链接其他的库的时候会在 该行下面添加。
2.内容短小精悍
3.实例精讲,都是有实际意义的项目:音频编码
4.提供好的学习经验;
helloJNI 的android.mk
#######################start############ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY) ##########################################
Android.mk详解
LOCAL_PATH 是描述所有要编译的C文件所在的根目录,这边的赋值为 $(call my-dir),代表根目录即为Android.mk所在的目录。
LOCAL_PATH通过调用my-dir函数来获取当前的路径,my-dir函数的定义位 于core/definitions.mk文件。这里不需要管太多主要的android.mk文件位置 放对,如果不对话可以通过编译的时候,提供路径参数。 include $(CLEAR_VARS) 代表在使用NDቤተ መጻሕፍቲ ባይዱ编译工具时对编译环境中所用到的 全局变量清零,如LOCAL_MODULE,LOCAL_SRC_FILES等,因为在一次 NDK编译过程中可能会多次调用Android.mk文件,中间用到的全局变量可 能是变化的。
基础理论
NDK编译
JNI接口封装
JAVA调用
测试
基础理论
C/CPP语法
JNI语法
Makefile
我这里有视频共享 /item.htm? spm=686.1000925.1000774.13.kso lDo&id=39893393512
视频简介
1.基础实用,可0基础学习;
相关文档
最新文档