Android.mk & Application.mk

makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。 1. Android.mk文件为Android NDK(原生开发)描述了C/C++源文件

  • 这个文件实际上是GNU Make文件的一小片段,它会被生成系统解析一次或多次。
  • 该文件的目的是为了让你能将你的源代码组织为组件(module) – 静态库(static library) or 共享库(shared library)

An example:  jni/Anroid.mk文件为NDK生成系统描述了这个共享库。它的内容为: ---------- cut here ------------------ 1.清除旧变量 LOCAL_PATH := $(call my-dir)//每个Android.mk文件都必须以定义LOCAL_PATH变量开始to locate the source file;宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录) include $(CLEAR_VARS)//CLEAR_VARS变量是生成系统提供的,它指向一个特殊的GNU Makefile.这个Makefile将会为你自动清除许多名为LOCAL_XXX的变量(因为所有的编译控制文件都在同一个GNU make 执行环境中,所有的变量都是全局的,E.g., LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等, LOCAL_PATH例外) 2.设置新变量 LOCAL_MODULE := hello-jni //名称必须是唯一的,而且不包含任何空格。编译系统会自动生成libhello-jni.so文件 LOCAL_SRC_FILES := hello-jni.c //源文件路径(需要编译的文件),多个文件用 ‘\’ 隔开 LOCAL_C_INCLUDES := $(LOCAL_PATH)/extra_inc$(LOCAL_PATH)/main_inc 3.调用编译函数 include $(BUILD_SHARED_LIBRARY)//加入所需要包含的头文件路径 ---------- cut here ------------------ 其实Android.mk所做的就是

  • 清除旧变量,
  • 设置新变量,
  • 调用编译函数(其实就是include一个固定的mk文件)

要将C\C++代码编译为SO文件,光有Android.mk文件还不行,还需要一个Application.mk文件。  2. Application.mk目的是描述在应用程序中所需要的模块(即静态库或动态库) Application.mk文件通常被放置在 $PROJECT/jni/Application.mk 例子: APP_STL := gnustl_static//默认情况下,NDK的编译系统为最小的C++运行时库(/system/lib/libstdc++.so)提供C++头文件。然而,NDK的C++的实现,可以让你使用或着链接在自己的应用程序中。  APP_CPPFLAGS := -frtti -fexceptions //编译c++文件 APP_ABI := armeabi-v7a //默认情况下,NDK的编译系统返回"armeabi"ABI生成机器代码。如为了支持IA-32指令集,可以使用 APP_ABI := x86;支持多种APP_ABI := armeabi armeabi-v7a x86 3. 在 c 文件中,函数名这样定义: Java_testNDK_android_HelloJni_stringFromJNI ,是因为这个是 JNI 的标准,定义需要按照如下格式: Java_packagename_classname_methodname , 例如: Java_testNDK_android_HelloJni_stringFromJNI extern "C" { JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_FindFeatures(JNIEnv* env, jobject obj, jint width, jint height, jbyteArray yuv, jintArray bgra) {}//JNIEXPORT 和JNICALL是必须要加的关键字命名规则如下:

  1. 函数名:Java_(包路径)_(类名)_(函数名) (JNIEnv *env, jobject obj, 自己定义的参数…),包路径中的”.”用”_”(下划线)代替,类名就是java中调用该态库函数的类的名字,最后一个才是真正的函数名;
  2. 变量名:C\C++类型前面加上j,如果是数组,则在后面加上Array:如jintArray就是int[], jbyteArray就是byte[].
  3. JNIEnv *env和jobject obj这两个参数时必须的,用来调用JNI环境下的一些函数
  4. jbyteArray yuv, jintArray bgra代表传进来的图像数据,jint width, jint height是宽和高

Please make attention about BGRA byte order, ARGB stored in java as int array becomes BGRA at native level

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

%d bloggers like this: