在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目录意义不太清楚,保存退出后刷新一下工程,编译后,启动模拟器