原创 Android.mk规范详解

2010-10-28 15:12 7411 12 12 分类: MCU/ 嵌入式

                                            Android.mk规范详解


       Android.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译。掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字,先来看一个简单的例子,这个例子在NDK包的D:\android-ndk-r3\apps\hello-jni\project\jni目录下:


 


Android.mk中的内容如下:


---------------------------------------------------------


LOCAL_PATH := $(call my-dir)


 


include $(CLEAR_VARS)


 


LOCAL_MODULE    := hello-jni


LOCAL_SRC_FILES := hello-jni.c


 


include $(BUILD_SHARED_LIBRARY)


-----------------------------------------------------------


 


LOCAL_PATH 是描述所有要编译的C文件所在的根目录,这边的赋值为$(call my-dir),代表根目录即为Android.mk所在的目录。


 


include $(CLEAR_VARS) 代表在使用NDK编译工具时对编译环境中所用到的全局变量清零,如LOCAL_MODULE,LOCAL_SRC_FILES等,因为在一次NDK编译过程中可能会多次调用Android.mk文件,中间用到的全局变量可能是变化的。关于这个问题看了下面比较复杂的例子可能就明白了。


 


LOCAL_MODULE 是最后生成库时的名字的一部分,给其加上前缀lib和后缀.so就是生成的共享库的名字libhello-jni.so。


 


LOCAL_SRC_FILES 指明要被编译的c文件的文件名


 


include $(BUILD_SHARED_LIBRARY) 指明NDK编译时将生成一些共享库


 


这个Android.mk设置对应的jni文件夹下的内容为如下图:



其hello-jni.c中的代码如下:


#include <string.h>


#include <jni.h>


 


/* This is a trivial JNI example where we use a native method


 * to return a new VM String. See the corresponding Java source


 * file located at:


 *


 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java


 */


jstring


Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,


                                                  jobject thiz )


{


    return (*env)->NewStringUTF(env, "Hello from JNI !");


}


 


关于如何使用NDK进行编译,可以查看我的博客“NDK底层开发环境的搭建”


关于hello-jni.c中的代码如何编写,可以查看附件中的“JNI详解.pdf”文件。


 


我们再来看一个复杂点的例子,下面这个例子中在使用NDK编译的过程中将会先产生一个静态库:libsum-jni.a,这个静态库将被进一步编译中调用一起生成共享库:libhello-jni.so


 


 


-----------------------------------------------------------------------------


LOCAL_PATH := $(call my-dir)


 


include $(CLEAR_VARS)


 


LOCAL_MODULE    := sum-jni


LOCAL_SRC_FILES := sum-jni.c


 


include $(BUILD_STATIC_LIBRARY)


 


include $(CLEAR_VARS)


 


LOCAL_MODULE    := hello-jni


LOCAL_SRC_FILES := hello-jni.c


 


LOCAL_STATIC_LIBRARIES := sum-jni


 


include $(BUILD_SHARED_LIBRARY)


-------------------------------------------------------------------------------------


 


这个Android.mk文件中我们可以看到include $(CLEAR_VARS)被使用了两次,这使得NDK编译过程中前后使用到的全局变量的值不会互相影响。


include $(BUILD_STATIC_LIBRARY)  指明将sum-jni.c文件编译成静态库


libsum-jni.a


 


LOCAL_STATIC_LIBRARIES := sum-jni  指明在第二部编译过程中调用第一步编译过程中生成的静态库libsum-jni.a,并结合hello-jni.c文件编译成共享库libhello-jni.so


 


这个Android.mk设置对应的jni文件夹下的内容为如下图:



 


hello-jni.c中的代码:


 


#include "sum-jni.h"


#include <string.h>


#include <jni.h>


 


/* This is a trivial JNI example where we use a native method


 * to return a new VM String. See the corresponding Java source


 * file located at:


 *


 *   apps/samples/hello-jni/project/src/com/example/HelloJni/HelloJni.java


 */


jstring


Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,


                                                  jobject this )


{


    return (*env)->NewStringUTF(env, "My name is Zibin Lai.");


}


 


jint


Java_com_example_hellojni_HelloJni_Jsum(JNIEnv* env, jobject this,jint a,jint b)


{


              return sum(a,b);  


}


 


sum-jni.c的代码:


int sum(int a,int b)


{


       return a+b;


}


 


 


最后看一个例子是多个C文件编译的Android.mk设置:


 


--------------------------------------------------------------------------------


LOCAL_PATH := $(call my-dir)


 


include $(CLEAR_VARS)


 


LOCAL_MODULE    := sum-jni


LOCAL_SRC_FILES := sum-jni.c


 


include $(BUILD_STATIC_LIBRARY)


 


include $(CLEAR_VARS)


 


LOCAL_MODULE    := hello-jni


LOCAL_SRC_FILES := hello-jni.c \


                                   compare-jni.c \


                                   sort/sort.c \


 


LOCAL_STATIC_LIBRARIES := sum-jni


 


include $(BUILD_SHARED_LIBRARY)


-----------------------------------------------------------------------------------


 


我们可以看到第二个LOCAL_SRC_FILES的参数赋值比以上的多了一些文件的名字,且在这个赋值过程还可以带上路径。


这个Android.mk设置对应的jni文件夹下的内容为如下图:


文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条