编译环境:eclipse
1,在Android官网下载NDK,下载链接见:http://developer.android.com/tools/sdk/ndk/index.html。
2,打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径,选择为刚才ndk的路径,例如我的是:D:\android\JAVA\android-ndk-r10e
3,新建一个Android工程,我新建了myndktest工程
4,右键选择Android Tools->Add Native Support,会让你填写库名,我填写的myndktest,和工程名不用相同,此时工程下面多了一个jni文件夹,里面包括myndktest.cpp和Android.mk两文件。
5,在Android工程中加载动态库和声明需要调用的C的方法,声明的是声明native方法, 注意该方法没有方法体 和 参数
package com.example.myndktest;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
static{
System.loadLibrary("myndktest");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println(helloFromJNI());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public native String helloFromJNI();
}
6,创建C文件,打开刚才jni中自动生成的myndktest.cpp,JNI 的使用在C和C++中有区别,这里我用C的方式,所以把myndktest.cpp改成myndktest.c,另外Android.mk也更改一下.
调用Java类型 : C中调用Java中的String类型为 jstring;
C语言方法名规则 : Java_完整包名类名_方法名(JNIEnv *env, jobject thiz), 注意完整的类名包名中包名的点要用 _ 代替;
#include <jni.h>
jstring Java_com_example_myndktest_MainActivity_helloFromJNI( JNIEnv* env, jobject thiz )
{
return (*env)->NewStringUTF(env, "Hello from JNI!");
}
7,编译ndk动态库,在工程上右键选择Build Configurations->Build All,之后工程的obj文件夹下面多出libmyndktest.so
此时项目结构是这样的:
8,项目完成,现在在src的java代码的helloFromJNI方法就调用了jni中c代码中的Java_com_example_myndktest_MainActivity_helloFromJNI方法。