一、NDK配置:
从ndk r7开始,不再需要cygwin;
选择项目单击右键,点击Properties,在Builders窗口中新建一个program,输入名称;
在main标签页的location选择ndk目录中的ndk-build.cmd,在Working Directory选择当前项目;
在Refresh标签页,勾选如下选项:
切换到Build Options标签页,勾选如下选项:
勾选完成,点击右边的 Specify Resources 按钮,选择项目的jni目录:
点击finish完成配置;
二、测试NDK:
编MainActivity.java文件(我在这个文件中使用的c代码里的函数),
package com.example.hellojni; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = new TextView(this); tv.setText(sayHello()); setContentView(tv); } private native String sayHello(); static{ System.loadLibrary("HelloJni"); } }
代码中新建了一个 TextView ,在设置显示文本的时候调用 sayHello() 方法,这个方法就是即将在C代码里编写的方法。
private native String sayHello();
这一行声明了被调用的本地方法;
static {
System.loadLibrary("HelloJni");
}
代码在onCreate之前调用,加载了由C代码编译来的库文件。
接下来利用MainActivity.java文件生成我们需要的.h文件:
打开cmd,进入本项目的src目录下,运行
javah -jni com.example.hellojni.MainActivity (也可以不加 -jni 参数,因为它是默认的)
运行后可以看到生成了一个.h文件,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_hellojni_MainActivity */ #ifndef _Included_com_example_hellojni_MainActivity #define _Included_com_example_hellojni_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_hellojni_MainActivity * Method: sayHello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
将其移到jni目录下,根据.h文件中声明的函数,在.c文件中实现函数体,在jni目录新建hellojni.c :
#include <string.h> #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_sayHello( JNIEnv *env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI !"); }
在jni目录中再新建一个Android.mk文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := HelloJni LOCAL_SRC_FILES := hellojni.c include $(BUILD_SHARED_LIBRARY)
Android.mk相当于makefile文件;想了解更多可以参考 :http://blog.csdn.net/xuxinyl/article/details/6555762
然后保存项目,就可以自动生成库文件了,可在libs目录找到。
如果没有生成,请查看console中有没有显示信息,可以根据这些信息找一下原因。