在上一篇博文中,我们搭建好了Android ndk 的开发环境,作为码农,我们是不是先来写一个HelloWorld来表示一下自己的到来。
(1)首先在你的工作空间建一个Android项目,这里我建立的为NDKHelloWorld。项目结构如图(1)
、
图(1)
(2)在MainActivity中声明你所需要的本地方法,MainActivity的代码如下所示:
package com.gc.ndkhelloworld; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; /** * * @author Android将军 * */ public class MainActivity extends Activity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView=(TextView) findViewById(R.id.tv); mTextView.setText(helloWorld()); } /** * 在Java代码中声明本地方法 * @return */ public native String helloWorld(); }
(2)选中该项目,右击选择Android Tools,然后选择Add Native Support...,如图(2)所示:
图(2)
然后出现图(3)所示情况:
图(3)
点击finish之后,会发现项目的目录结构如图(4)所示:
图(4)
下面我们开始实现本地方法,helloworld.cpp的代码如下:
#include <jni.h> #include <stdio.h> /** * @author Android将军 */ /** * * 实现本地方法时,一个要按照函数命名规则来命名,函数的命名规则如下: * Java_PackageName_ClassName_MethodName * 从这个规则可以看出,任何由Java程序调用的NDK函数名都必须以Java开头,紧跟着要调用该函数的Java类 * 所在的包名(中间的“.”要改成“_”),然后会跟Java类名,最后是方法名,各部分直接都用“_”连接。 */ extern "C" { jstring Java_com_gc_ndkhelloworld_MainActivity_helloWorld(JNIEnv *env,jobject obj) { return env->NewStringUTF("NDK,HelloWorld!"); } }
实现完本地方法后,下面我们需要编译本地库,选中该项目,右击选择Build Project来进行编译本地库,编译完本地库之后,就需要加载本地库了。在静态初始化块内调用System.loadLibrary加载本地库,是加载库的最简单的方法,本例中加载库的代码如下所示:
static { System.loadLibrary("helloworld"); }
编译完本地库之后,你可以发现libs目录下多了一个armeabi目录,这是因为我们没有为该项目指定一个Application.mk文件,而Android NDK构建系统默认情况下为armeabi ABI生成二进制文件。为了我们的本地库可以在NDK所支持的所有架构上运行,我们在jni目录下需要增加一个Application.mk文件,文件内容如下:
APP_ABI := all
如果一切顺利的话,大家可以在模拟器或者真机上看到该案例的运行效果如下:
如果大家在实现本地方法时,遇到could not be resolved或Unresolved inclusion: <jni.h>情况,请按下图解决:
该案例Demo下载地址:Demo上传csdn下载频道了,可是怎么也刷不出来地址,等有地址之后,再把该地址更新。
转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/44899927