Android NDK编写一个HelloWorld

在上一篇博文中,我们搭建好了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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。