Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android NDk开发系列(Hello JNI)

$
0
0

前言

本篇博客主要记录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();

}

最后项目成功运行


作者:u011692041 发表于2016/9/23 22:18:53 原文链接
阅读:183 评论:1 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles