NDK从7开始自带编译器,在windows上无需配置cygwin的环境。

在eclips中配置NDK路径

在eclipse中点击菜单栏window-Perferences,配置NDK的路径。

[img]http://dl2.iteye.com/upload/attachment/0088/5207/60d81edf-c57e-3fc1-8ed4-5cedfb7ace91.jpg[/img]

在工程中添加native lib


新建一个空白的Android工程,在根目录上点击右键Adnroid Tools - Add Native Support...

[img]http://dl2.iteye.com/upload/attachment/0088/5209/0114c30b-cc5d-3be3-a5a0-dfe069b68d3e.jpg[/img]

在弹出的对话框中输入要新建的lib的名称,点击Finish,在工程目录下会多出一个jni文件夹,里面有一个空白的cpp文件和一个Android.mk文件

[img]http://dl2.iteye.com/upload/attachment/0088/5213/cc115db4-54bf-35b3-abdf-15e527df523e.jpg[/img]

Android.mk文件的内容是


LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE := TestJni

LOCAL_SRC_FILES := TestJni.cpp


include $(BUILD_SHARED_LIBRARY)


TestJni就是要加载的lib的名称,LOCAL_SRC_FILES 是资源文件的路径。


hello jni



MainActivity.java代码如下:

package com.example.testjni;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

TextView textView = new TextView(this);
textView.setText(helloFromJni());
setContentView(textView);
}

public native String helloFromJni();

static {
System.loadLibrary("TestJni");
}
}


TestJni.cpp代码如下:


#include <jni.h>

extern "C" jstring Java_com_example_testjni_MainActivity_helloFromJni(JNIEnv *env, jobject thiz) {
return env->NewStringUTF("Hello From Jni");
}


直接运行程序,可以在Console窗口中看到NDK build的输出


[img]http://dl2.iteye.com/upload/attachment/0088/5217/fd9405cd-d939-3a76-94e1-eee48ae59731.jpg[/img]


有一点要注意:由于我使用的是x86的Android虚拟机来运行,所有使用的是x86的编译器。制定编译器的方法是在jni目录新建一个Application.mk的文件,输入以下内容



#APP_ABI := armeabi


APP_ABI := x86


#APP_ABI := armeabi armeabi-v7a x86 mips mips-r2 mips-r2-sf


#APP_ABI := all


APP_STL := stlport_static



如果是普通arm处理器的Android手机,使用APP_ABI := armeabi,如果是x86处理器的,使用APP_ABI := x86,等等。



如果APP_ABI := all,会编译所有指令的so。



运行结果如下:


[img]http://dl2.iteye.com/upload/attachment/0088/5219/951fc484-3cad-362d-bd6e-44ac021ec365.jpg[/img]


至于C/C++的编译是怎么实现的,我们可以查看一下工程的Properties


[img]http://dl2.iteye.com/upload/attachment/0088/5221/2bc7fcb9-5cc3-31b4-b627-d00c6d74f546.jpg[/img]


在Builders里面有多了两项,一个是CDT Builder,一个是Scanner Configuration Builder。



现有的工程添加Builder



如果工程里面已经有jni目录了,但是没有配置C/C++的编译器,高手们可以自己添加Builder,对于我这种爱投机取巧的小菜鸟,工程右键菜单,新添加一个空白的so,然后再删除,CDT Builder和Scanner Configuration Builder就出来了。