在ubuntu下搭建了Android NDK开发环境,网络资料很多,不过还是自己作下记录。
NDK简介
NDK,全称为Native Development Kit,NDK是一系列工具的集合。
* NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
* NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。”
下载及安装
下载地址,http://dl.google.com/android/ndk/android-ndk-r7b-linux-x86.tar.bz2
然后执行以下操作
gavin@gavin-desktop:~$ tar -xvf android-ndk-r7b-linux-x86.tar.bz2 -C ~/
gavin@gavin-desktop:~$ sudo vi /etc/profile
在文件最后加上下面两行
NDK_HOME=$HOME/android-ndk-r7b/ export PATH=$PATH:$NDK_HOME
输入ndk-build命令验证是否成功
也可以编译一下官方提供的示例程序测试一下gavin@gavin-desktop:~$ ndk-build Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. /home/gavin/android-ndk-r7b/build/core/build-local.mk:130: *** Android NDK: Aborting 。 停止。
gavin@gavin-desktop:~$ cd android-ndk-r7b/samples/hello-jni/ gavin@gavin-desktop:~/android-ndk-r7b/samples/hello-jni$ ndk-build Gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Compile thumb : hello-jni <= hello-jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => libs/armeabi/libhello-jni.so gavin@gavin-desktop:~/android-ndk-r7b/samples/hello-jni$ ls libs/armeabi/ gdbserver gdb.setup libhello-jni.so
Hello NDK在eclipse中新建一个android的activity工程,名为HelloNDK, 在界面中放置一个TextView, ID设置为myText。java代码文件HelloNDKActivity.java内容如下:
package com.gavin.example; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloNDKActivity extends Activity { private TextView mTextView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mTextView = (TextView) findViewById(R.id.myText); mTextView.setText(sayHello()); //这里调用本地代码函数,获取一个字符串 } public native String sayHello(); //本地代码函数 static { System.loadLibrary("helloNDK"); //导入共享库helloNDK } }
下一步就是要生成c语言的共享库helloNDK。在工程目录下新建目录jni,使用javah命令生成导入函数接口文件gavin@gavin-desktop:~/workspace/HelloNDK$ javah -classpath bin/classes com.gavin.example.HelloNDKActivity
将生成的头文件com_gavin_example_HelloNDKActivity.h,copy到jni目录下。
在jni目录下新建一个文件com_gavin_example_HelloNDKActivity.c,实现头文件中声明的函数,内容如下:
#include <string.h> #include <jni.h> #include <string.h> #include <jni.h> jstring Java_com_gavin_example_HelloNDKActivity_sayHello( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Hello NDK"); }
在jni目录新建文件Android.mk,内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := helloNDK LOCAL_SRC_FILES := com_gavin_example_HelloNDKActivity.c include $(BUILD_SHARED_LIBRARY)
现在回到eclipse,把ndk-build集成到eclipse中,Properties ->Builders-> New, 配置如下:
Working Directory目录意义不太清楚,保存退出后刷新一下工程,编译后,启动模拟器