Android NDk开发系列(Hello JNI)

前言

本篇博客主要记录NDK开发之入门小demo,虽说NDK开发包里面有hellojni的项目,但是博主还是记录一下学习的过程吧.AS2.2现在对NDK支持的已经很好了,但是博主学习NDK还是采用eclipse作为工具,学的是一个思路,工具只是使用方式不同,所以不用纠结工具的事情了哦

在博文中您可能会遇到一些问题,请到博主的另一篇博客中去寻找一下博主是否已经陈述,如果没有陈述可以直接评论通知博主,博主会尽快更新

传送门:NDK之疑难杂症篇

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();

}


最后项目成功运行


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值