首先,在eclipse里面创建一个androidproject,设定包名(com.test)。
然后创建一个java文件,例如命名为testMine,在其中声明native的方法,如下:
package com.test;
public class testMine {
public staticnative long calculate(int n);
}
然后编译该项目。
在命令窗口中,进入该项目所在文件夹, 执行命令
javah -classpath bin/classes -jni -d jni com.test.testMine
注意, classpath要指向classes文件所在。这样,就在jni文件夹中生成了一个头文件com_test_testMine.h, 这个是自动生成的文件,内容如下。如果需要新版本的该文件,可以通过javah命令再次生成。
/* DO NOT EDIT THISFILE - it is machine generated */
#include <jni.h>
/* Header for classcom_test_testMine */
#ifndef_Included_com_test_testMine
#define_Included_com_test_testMine
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_test_testMine
* Method: calculate
* Signature: (I)J
*/
JNIEXPORT jlongJNICALL Java_com_test_testMine_calculate
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
接下来要做的就是实现Java_com_test_testMine_calculate方法。
建立对应这个header的文件com_test_testMine.c
#include"com_test_testMine.h"
jlong JNICALLJava_com_test_testMine_calculate(JNIEnv * jnienv, jclass clas,
jint n) {
return n + 1;
}
然后在该目录下创建一个Android make 文件,Android.mk
LOCAL_PATH := $(callmy-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=testMine
LOCAL_SRC_FILES :=com_test_testMine.c
include$(BUILD_SHARED_LIBRARY)
一般情况下基本格式默认,除了LOCAL_MODULE和LOCAL_SRC_FILES要根据命名进行更改。
接下来就该对它进行编译了,如果还没有下载NDK的必须要下载, <ndk>指向该目录所在地。
进入到该项目的根目录,即jni文件的上层目录,然后执行
<ndk>/ndk-build
这样就把testMine生成so文件,同时它还给安装到project/libs下了
Compile thumb : testMine <= com_test_testMine.c
SharedLibrary : libtestMine.so
Install : libtestMine.so =>libs/armeabi/libtestMine.so
修改一开始生成的testMine.java文件,增加loadLibrary调用,从而在一开始就载入该library。
package com.test;
public class testMine{
static {
System.loadLibrary("testMine");
}
public static native long calculate(int n);
}
这下就可以调用该calculate 方法了, 一个简单的例子是另外创建一个Activity进行调用,如下例中showResult.java
package com.test;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.widget.Toast;
public classshowResult extends Activity {
@Override
protected void onCreate(BundlesavedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
long result = testMine.calculate(100);
Toast.makeText(getApplicationContext(),"result="+result, Toast.LENGTH_LONG).show();
}
}
当然需要对该项目的AndroidManifest.xml进行更新,加入该Activity的信息
<?xmlversion="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdkandroid:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".showResult" >
<intent-filter >
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
编译运行,然后就可以看到一个提示框显示结果101.
一个简单的android ndk实例就此告成。