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

Android Notes 同时被 2 个专栏收录
22 篇文章 0 订阅
16 篇文章 0 订阅
补了几天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中的代码。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

刘云龙在搞机

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值