安装好eclipse、ADT、NDK(r9以上)后,编写NDK的具体步骤:
1.新建一个Android project
file->new->project...->android->android application project,next。。。。。。
2.新建一个jni文件
工程,右键android tools->add native support...,给.so文件取名,完成后,工程中自动生成
myNdk.cpp文件中编写底层的代码,Android.mk文件中一般不需修改
3.myNdk.cpp
#include <jni.h>
#include <string.h>
extern "C" {
JNIEXPORT jstring JNICALL Java_com_example_androidndk_JNI_getString(JNIEnv* env, jobject obj)
{
//返回一个字符串
return (env)->NewStringUTF("Hello NDK!");
}
}
JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替,即com_example_androidndk) + _ + 调用该接口的类名(即JNI) + _ + 方法名(即getString),对于实例方法,有两个参数是必要的,一个JNI的环境指针JNIEnv *,另一个是调用该方法的Java实例jobject,如果还需要传入参数,可在和两个参数后面接着加上去,例
JNIEXPORT jint JNICALL Java_com_example_androidndk_JNI_add(JNIEnv* env, jobject obj, jint a, jint b)
注:
这里加上extern“C”,是为了从C语言导出,避免错误出现如下错误
4.新建调用JNI
右键src下的包名(即将其和mainactivity同目录),new->class,输入名称JNI,即myNdk.cpp中调用该接口的类名(此二者名称应相同,但不一定要用JNI)
package com.example.androidndk;
//此文件相当于函数声明
public class JNI {
//获取字符串
public native String getString();
}
为什么要建这么一个文件,从个人理解上来说,你可以吧JNI.java看成class中的.h文件,把myNdk.cpp看成class中的.cpp文件,这样将来不管那个java文件调用相关的函数,都可以从JNI.java中调用
5.建立.so文件
只需build一下,eclipse就自动建立了.so文件
此时,可能会出现如下错误:Unable to launch cygpath. Is Cygwin on the path?
解决办法:
1)工程右键,点Properties->C/C++ Build的Building Settings中去掉Use default build command,然后输入${NDKROOT}/ndk-build.cmd
2)在C/C++ Build中点击Environment,点Add...添加环境变量NDKROOT,值为NDK的根目录
6.使用
在mainactivity.java中使用函数
package com.example.androidndk;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
//使用静态代码块加载类库
static{
System.loadLibrary("myNdk");//一定要注意名称没有“lib"
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button)findViewById(R.id.show_btn);
//定义本地类
final JNI jni = new JNI();
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//显示从C代码中返回的字符串
Toast.makeText(getApplicationContext(), jni.getString(), Toast.LENGTH_SHORT).show();
}
});
}
}
运行程序