Eclipse的ndk初步使用

来源:互联网 发布:天刀捏脸数据在哪儿看 编辑:程序博客网 时间:2024/05/19 20:39

1. 新建一个Android project 名为JNI

 


2. 编写jni文件

JNIJava Native Interface)就是连接JavaNative的接口,主要是定义了一些JNI函数,让开发者可以通过调用这些函数实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码,这样就可以发挥各个语言的特点.Native程序就是非java的语言,主要是由c/c++语言编写的程序,JNI相当与两者之间的接口。

 

在工程目录下新建一个名为jni的文件夹,目录下生成两个文件test.cAndroid.mk文件。

 

 

Android.mkndk-build的脚本文件,ndk-build使用的脚本文件是Android.mkApplication.mk,Application.mk是可选的。Android.mk文件是工程的编译脚本,告知编译系统关于源文件的一些信息,描述了编译原生程序所需的编译选项、头文件、源文件等等。Application.mk文件用来描述原生程序本身使用到的一些特性,如原生程序支持的ARM硬件指令集、STL支持等。

Android.mk的常用语句:

LOCAL_PATH := $(call my-dir)

        Android.mk文件开头必须先定义好LOCAL_PATH变量。LOCAL_PATH定义了本地源码的路径,它用于在开发树中查找源文件。call my-dir指定了调用my-dir宏,这个宏函数是编译系统提供的,用于返回Android.mk文件本身所在的路径。

include $(CLEAR_VARS)

       CLEAR_VARS由编译系统提供,指定让编译系统清除掉一些已经定义过的宏(如LOCAL_MODULELOCAL_SRC_FILESLOCAL_STATIC_LIBRARIES等等),这些宏的定义都是全局的。当一个GNU MAKE在编译多个模块时,必须清除并重新设置它们。

LOCAL_ARM_MODE := arm

       LOCAL_ARM_MODE指定生成的原生程序所使用的ARM指令模式,取值为arm或者thumbarm表示使用32位的arm指令系统,thumb表示使用16位的arm指令系统。

LOCAL_MODULE :=test

       LOCAL_MODULE指定模块的名称,即原生程序生成后的文件名。注意,如果生成共享库模块,编译系统会自动产生合适的前缀和后缀,对于本例中的源文件最终将生成名为libtest.so的共享库。

LOCAL_SRC_FILES := test.c

       LOCAL_SRC_FILES指定将要编译打包进模块中的C\C++源代码文件列表,此处只有一个test.c文件。

include $(BUILD_SHARED_LIBRARY)

       此语句用来指定生成的文件类型。BUILD_EXECUTABLE表示生成可执行程序,BUILD_SHARED_LIBRARY表示生成动态库,BUILD_STATIC_LIBRARY表示生成静态库。

 

Test.c的代码和Android.mk的代码如下:

 


 

3. 使用ndk-build进行编译

进入jni文件目录下:

输入ndk-build命令就可以在工程目录下生成libs文件夹,这里生成不同cpu架构的test可执行文件(Android.mk使用的是include $(BUILD_EXECUTABLE))。

 

根据模拟器的cpu将相同架构文件夹下生成的可执行程序test复制到模拟器或者手机中,在命令行窗口下输入命令即可让其运行

我这里用的是armeabi-v7a

 

 

 

 

 

 

使用eclipse的自动编译,虽然同样是使用ndk-build,但是更高效

1. JNI工程上右键选择Properties,点击Builders选项,再点击Builders选项页右侧的New按钮,然后双击Program项打开Edit Configuration对话框,在对话框的Name栏输入Builder的名称,这里输入“JNI_Builder”,在Location 栏输入“${env_var:ANDROID_NDK}/ ndk-build.cmd” 设置要执行的命令,(这里的ANDROID_NDK是配置NDK环境时在系统变量中的名称,实验时需要结合自己的实际配置填写)可以自己具体设置,点击variables->edit variables->new .

2. 点击Working Directory右侧的Browse Workspace按钮选择JNI工程,最后点击Apply按钮应用更改.

 

3. 单击生成的JNI_Builder下的Refresh标签,勾选“Refresh resources upon completion”复选框。

        单击Build Options标签,勾选“During auto builds”与“Specify working set of relevant resources”复选框,点击“Specify Resources”按钮,勾选JNI工程的jni目录,点击finish按钮,点击OK按钮关闭Edit Configuration对话框。

        点击OK按钮关闭Properties对话框,这时JNI工程就会自动编译,最后在libs\armeabi目录下生成.c文件的可执行文件,效果如右图所示。以后在Eclipse中对jni目录下的任何文件进行修改保存操作,都会触发JNI_Builder重新编译工程。如果是使用ndk-build手动编译工程,那么每次修改完jni目录下的文件后都得在命令行窗口下对工程进行手动编译。

 

 

 

 

原创粉丝点击