本文适合完全没有ndk开发经验的人阅读
开发环境android studio
1下载ndk 解压在as中配置ndk的路径
点击下载ndk
下载后解压
如上图配置后,会在local.properties文件下生成路径,说明配置生效
2新建jni类
jni类中声明用到的native方法
public class JNI {
//获取字符串
public native String getString();
}
3新建activity
我们这里就是要实现界面上通过jni显示底层c返回的字符串
public class AndroidNDKDemoActivity extends Activity {
//使用静态代码块加载类库
static{
System.loadLibrary("first_jni");//一定要注意名称没有“lib"
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn1 = (Button)findViewById(R.id.show_btn);
//定义本地类
final JNI jni = new JNI();
btn1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//显示从C代码中返回的字符串
Toast.makeText(getApplicationContext(), jni.getString(),Toast.LENGTH_LONG).show();
}});
}
}
4使用javah命令生成.h文件
这里使用android studio的Terminal命令行。之前参考的文章多数要求需要安装cygwin我也安装了,但是费了九牛二虎之力也没有最后成功。android studio的强大之处就是比eclipse内置了更多的功能。当然这里使用的还是低版本的android studio 后面的文章会介绍新版as对于ndk开发提供的强大功能,这里就是先体验一下ndk而已。
此处编码报错不影响,实际.h已经生成如图 具体javah命令介绍如下。
这样会在main下面生成jni包我们通过javah生成的文件也会在下面
这里要说一下,你要保证你jdk环境配置可行,否则可能调用不到javah命令)
5jni包下新建c文件
jni的编写规范暂时先不管,只是方法返回了“hello NDK”
#include"jni.h"
/*
* Class: com_ndk_demo_JNI
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_litao_myndk_JNI_getString(JNIEnv* env, jobject obj)
{
//返回一个字符串
return (*env)->NewStringUTF(env,"Hello NDK!");
}
6新建Android.mk文件
大家都知道在Linux下编辑经常要写一个Makefile文件, 可以把这个Makefile文件理解成一个编译配置文件,它保存着如何编译的配置信息,即指导编译器如何来编译程序,并决定编译的结果是什么。而在Android下的Android.mk文件也是类型的功能,顾名思义,从名字上就可以猜测得到,Android.mk文件是针对Android的Makefile文件.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := first_jni
LOCAL_SRC_FILES := NDKDemo.c
include $(BUILD_SHARED_LIBRARY)
我们来解释一下这几行代码:因为这里是第一个ndk例子所以太复杂的解释没必要先说这里用到的。好了不多说,上面文件中我们目前注意两行就可以了LOCAL_MODULE := first_jni 指定了module名字;LOCAL_SRC_FILES := NDKDemo.c 指定了我们编写的.c文件。
7配置build.gradle
不同的处理器架构使用的so库是有差别的。在android studio中的build.gradle可以配置生成的so库类别。
这里指出eclipse中可能需要使用Application.mk文件来实现这里的功能。as没必要了。这里指定生成三种。
8编译出so库
在如图所示目录下可以看出生成了三种
9复制so库到lib并改名为jniLibs
as默认去jniLibs寻找,所以需要新建并把生成的so复制进来。在新版本的android studio中并不是这样的。后面的文章再讨论。