前言
本篇博客主要记录NDK开发之入门小demo,虽说NDK开发包里面有hellojni的项目,但是博主还是记录一下学习的过程吧.AS2.2现在对NDK支持的已经很好了,但是博主学习NDK还是采用eclipse作为工具,学的是一个思路,工具只是使用方式不同,所以不用纠结工具的事情了哦
1.首先创建一个普通的Android项目
创建好我们的工程之后呢,我们需要先书写一个本地方法来使用JNI
xml布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="bt_click" android:text="@string/hello_world" /> </RelativeLayout>
Activity代码
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // 按钮的点击事件处理 public void bt_click(View v) { Button bt = (Button) v; bt.setText(getString()); } /** * 调用c代码返回一个字符串 * * @return */ private native String getString(); }
可以看到我们的代码很简单,点击按钮触发bt_click事件,然后获取本地方法返回的字符串,然后显示在按钮上,这时候我们的app层面的代码已经写好了,本地方法是需要我们使用c代码去实现的
添加本地的支持
右键项目添加本地支持
这个是帮你创建的动态链接库的名称,也就是我们经常使用的第三方sdk中经常看到的.so文件,点击确定
确定以后你会发现在项目中多了一个文件夹jni,里面还有一个.cpp的文件,还有个Android.mk文件
我们更改.cpp后缀为.c,然后打开这个文件
里面没有任何的代码,这是需要我们自己去写Activity中那个本地方法的实现的
实现本地方法
使用javah命令生成头文件
右键项目拿到项目的目录
来到项目的目录下面,并且进入src目录
使用cmd进入该目录
生成头文件
后面的是你的activity的包名+Activity名称
成功就是不提示任何信息,如果你的activity中有中文会失败,提示不可映射的字符
成功之后在src目录中生成了一个头文件
我们打开它,复制其中的实现方法
红色框框里面的就是我们需要复制的代码,然后我们复制到我们的.c文件中,去掉最后的封号,加上一对花括号,然后在括号中加上变量的名字,然后我们返回一个字符串
#include <jni.h> JNIEXPORT jstring JNICALL Java_com_xiaojinzi_jnidemo_MainActivity_getString (JNIEnv * env, jobject jb){ return (*env) ->NewStringUTF(env,"welcome to JNI world"); }
实现方法必须是以下的格式:Java_包名_类名_方法名
NewStringUTF是一个JNI中的函数,现在可以先不管,知道他能返回一个字符串就行了,内容是后面的
"welcome to JNI world"
这时候我们的实现方法写好了,然后我们需要生成.so文件
编辑Application.mk文件
在jni文件夹中新建一个Application.mk文件,里面的内容为
APP_ABI := all
就一句话,是表示生成支持所有平台的.so文件
修改Android.mk
注意还有一点,打开我们的Android.mk文件
这里说明了实现的文件是哪个,我们刚刚改成了.c文件,所以这里需要改成JniDemo.c
在Activity中加载这个库
最后我们在activity中加载这个库,就可以运行项目啦
public class MainActivity extends Activity { static{ System.loadLibrary("JniDemo"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void bt_click(View v) { Button bt = (Button) v; bt.setText(getString()); } private native String getString(); }
最后项目成功运行