Andoid - 开发实例(7):JNI.NDKHelloWorld

补了几天C语言的知识,今天来试试NDK开发,百度的资料,结合自己编写的过程,简单的记录一下。

开发环境:android-ndk-r8d + ADT v21.0.1-543035
在ndk-r7b之前还必须用Cygwin来交叉编译,之后的版本ndk自己就可以进行交叉编译了,ndk根目录提供了个 ndk-build.cmd 的命令,使用它即可交叉编译。

首先:把 android-ndk-r8d 根目录添加到环境变量中(因为我们要使用到 ndk-build.cmd 这个命令)

添加好了之后,即可开始我们的 NDK HelloWorld

1. 新建一个工程 如下:

后面的一路next 即可。

2.在Java代码中声明一个 native 方法:public native String helloworldFromC();

3.创建一个 jni 目录 ,新建 HelloWorld.c 和 Android.mk 两个文件

4.编写 HelloWorld.c :
#include <stdio.h>
#include <jni.h>

jstring Java_com_ndkhelloworld_MainActivity_helloworldFromC(JNIEnv* env, jobject obj) {

	return (*env)->NewStringUTF(env, "HelloWorld");
}
Q1:jstring 是什么?
A1:是 jni.h 中 定义的一个typedef  jobject   jstring ,而 jobject 则是 一个 void* 

Q2:Java_com_ndkhelloworld_MainActivity_helloworldFromC 这个函数名怎么这么诡异?!
A2:这个函数名的命名规则是:Java_<包名( . 都换成 _ )>_<类名>_<方法名>  !注意区分大小写

Q3:JNIEnv* env, jobject obj 函数为什么需要这两个参数?
A3:咳咳~~我也不知道  ,照抄的

Q4:JNIEnv 是个什么东西?
A4:JNIEnv 是 JNINativeInterface一个指针变量。同样也是jni.h中有定义的。

Q5:NewStringUTF() 这个方法是?
A5:是JNINativeInterface 中提供的一个制造 String 的函数。

5.编写 Android.mk:
   这个文件的格式可以在android-ndk-r8d/docs/ANDROID-MK.html中找到。
   LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

   LOCAL_MODULE    := HelloWorld
   LOCAL_SRC_FILES := HelloWorld.c

   include $(BUILD_SHARED_LIBRARY)
6.生成so库文件:

7.Java 代码中调用 native 代码
完整代码如下:
package com.ndkhelloworld;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	static {
		// 加载库文件
		// 这个 HelloWorld ,必须和Android.mk 中 LOCAL_MODULE 一致
		System.loadLibrary("HelloWorld");
	}

	public native String helloworldFromC();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	// 这个是布局文件中Button响应的onClick事件
	public void click(View v) {
		Toast.makeText(this, helloworldFromC(), Toast.LENGTH_SHORT).show();
	}

}

OK~~运行下程序,点击按钮,


效果还不错~~java成功调用到c中的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值