Android 开发环境配置

    技术2025-04-15  22

        Android.mk规范详解

     

    本文转自:http://blog.ednchina.com/laizibin315/1895365/message.aspx

           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)