序章:

1.本篇是JNI入门教程的第二篇,偏基础功能的实现。完整教程连接如下:

https://blog.csdn.net/rzleilei/article/details/122084609https://blog.csdn.net/rzleilei/article/details/122084609

2.本篇要完成的需求如下:

从JNI方法中返回一个字符串,然后在安卓中展示。

一。流程步骤

安卓中调用jni主要包含以下几个步骤:

1.在java中声明引用。

2.在jni中创建对应的h文件和cpp文件。

3.在CMakeLists中进行声明,声明之后jni中的方法才能被java外部调用。

二。在java中创建声明类

这里我们创建一个java类,叫Java2CJNI,

我这里创建的java类的包名是:com.xt.client.jni,后面会用到。

里面主要做以下两件事:

public class Java2CJNI {//加载so库static {System.loadLibrary("Java2C");}//native方法public native String java2C();}

1.static静态方法块中加载so库。

这里加载的库名叫Java2C,后面CMakeLists和JNI中是需要和这个名称对应的。

2.对native方法进行声明。

这里声明的方法是java2C,返回类型是String,没有传入参数。

这个和库名并不存在绑定的关系。但是需要和后面的CMakeLists和JNI的方法名进行绑定。

三。在jni中创建h和cpp文件

我在工程目录下创建一个jni文件夹,和java同级。然后分别创建

com_xt_client_jni_Java2CJNI.h和Java2C.cpp两个文件

1.创建com_xt_client_jni_Java2CJNI.h文件:

这里的文件名是需要和java类的包名对应的,

com_xt_client_jni这里对应的是包名,

Java2CJNI对应的是JAVA中的类名。

文件内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_xt_client_jni_Java2CJNI */#ifndef _Included_com_xt_client_jni_Java2CJNI
#define _Included_com_xt_client_jni_Java2CJNI
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_xt_client_jni_Java2CJNI* Method:    java2C* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_xt_client_jni_Java2CJNI_java2C(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

这里主要就是声明一个方法:

Java_com_xt_client_jni_Java2CJNI_java2C

方法名字构成规则是:JAVA+包名+类型+方法名,JNIEnv和jobject是默认传入参数,返回类型是jstring,对应的就是java中的string类型。

其中JNIEnv是jni环境,我们使用JN I中的方法,基本都是靠调用JNIEnv实现的。

jobject指的是调用native方法的对象。

2.创建Java2C.cpp文件:

#include <jni.h>
#include "com_xt_client_jni_Java2CJNI.h"
#include<android/log.h>JNIEXPORT jstring JNICALL Java_com_xt_client_jni_Java2CJNI_java2C(JNIEnv* env, jobject instance)
{return (env)->NewStringUTF("I am From Native C");
}

这里cpp的文件名可以随便起的,并不需要和h文件对应。我们这里实现逻辑比较简单,直接返回一个字符串。

这里需要注意的时,C中字符串是char类型的,是不能直接返回给java的,所以我们要调用env中NewStringUTF方法,把char转化为jstring类型,然后在返回。

四。CMakeLists中做好声明

1.创建文件Cmake文件:

src同级目录下,创建CMakeLists.txt文件,内容如下:

cmake_minimum_required(VERSION 3.4.1)# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.add_library( # Sets the name of the library.  设置生成so文件名Java2C# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).  要编译的C/C++文件src/main/jni/Java2C.cpp)

这里Java2C对应的就是第二章中声明的so库名。

src/main/jni/Java2C.cpp对应的是我们cpp文件的完整路径。

2.gradle中做好声明

app的build.gradle文件中,在android{}模块下,添加如下声明:

externalNativeBuild {cmake {path "CMakeLists.txt"
//            version "3.10.2"}}

五。验证效果

准备工作全部做好了,我们就可以开始验证了。

我的调用方法如下:

 override fun clickItem(position: Int) {if (position == 0) {var java2CJNI = Java2CJNI()val result = java2CJNI.java2C()mResult.text = resultreturn}
...
}

这时候,我们可以看到页面上显示出了来自JNI层的字符串:

六。项目源码链接:

https://github.com/aa5279aa/android_all_demohttps://github.com/aa5279aa/android_all_demo/blob/master/DemoClient

调用入口类:

https://github.com/aa5279aa/android_all_demo/blob/master/DemoClient/app/src/main/java/com/xt/client/activitys/JNIActivity.kt

JNI入门课程-第二章:JNI基础调用相关推荐

  1. JavaSE入门0基础笔记 第二章Java基础语法

    JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...

  2. 尚硅谷Java入门视频教程第二章——Java基本语法

    尚硅谷Java入门视频教程第二章 第一章复习 课后习题 Java语言概述 第2章:Java基本语法 2.1 关键字和保留字 2.2 标识符(Identifier) 2.3 变量 2.3.1 变量基本概 ...

  3. pandas 第二章 pandas基础

    第二章 pandas基础 import numpy as np import pandas as pd import xlrd 在开始学习前,请保证pandas的版本号不低于如下所示的版本,否则请务必 ...

  4. 【python第一章 基础捋顺,第二章 python基础语法】

    第一章 基础捋顺,第二章 python基础语法 第一章 基础捋顺 第二章 python基础语法 2.1输入输出 2.2代码注释 2.3代码缩进 2.4命名规范 2.5变量 2.6基本数据类型 2.7数 ...

  5. 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记4:第二章 NumPy基础3——数组的组合、分割,数组转换为列表

    第二章 NumPy基础3 本章示例代码中的输入和输出均来自IPython会话. 2.7 数组的组合 NumPy数组有水平组合.垂直组合和深度组合等多种组合方式,我们将使用vstack.dstack. ...

  6. 鸟哥的Linux私房菜(服务器)- 第二章、基础网络概念

    第二章.基础网络概念 最近更新日期:2011/07/15 你的服务器是放在网络网络上面来提供服务的,所以,如果没有网络或者是网络不通,那么你的服务器当然是英雄无用武之地啦! 此外,服务器上面的网络服务 ...

  7. 《机器学习系列教程》:第二章 机器学习基础

    第二章 机器学习基础 机器学习and 数据分析 2.2 监督学习.非监督学习.半监督学习.弱监督学习? 根据数据类型的不同,对一个问题的建模有不同的方式.依据不同的学习方式和输入数据,机器学习主要分为 ...

  8. Datawhale数据分析课程第二章

    Datawhale数据分析课程第二章 准备工作 数据清洗及特征处理 相关定义 缺失值观察与处理 任务一:缺失值观察 (1) 请查看每个特征缺失值个数 (2) 请查看Age, Cabin, Embark ...

  9. Python面试宝典(第二章 Python基础)

    Python面试宝典(第二章 Python基础) Python面试宝典(第二章 Python基础) 基础语法 输入输出 问题:代码中要修改不可变数据会出现什么问题? 抛出什么异常? 问题:a=1,b= ...

最新文章

  1. iOS9 This application is modifying the autolayout engine from a background thread, which
  2. hls.js播放hls直播源
  3. Jmeter内置函数功能(五)
  4. WinForm编程数据视图之DataGridView浅析
  5. 加载场景不销毁的实现
  6. 微软已暂时停用你的帐户_Apple ID 被停用如何解决?
  7. android圆形头像 demo,Android图像处理之绘制圆形头像
  8. MyBatis-Plus_查询返回实体对象还是map?
  9. html标签info,HtmlTrInfo 元素
  10. USGS下载遥感影像——以Landsat影像下载为例
  11. 如何将.sql文件导入数据库
  12. matlab中变压器的仿真,基于MATLAB的稳压变压器建模与仿真
  13. Microbiome:鸡肠道微生物宏基因集(张和平、魏泓、秦楠点评)
  14. Unity Editor 基础篇(三):自定义窗口
  15. c++11 日期和时间工具(std::chrono::duration)(三)
  16. 深度学习中框架中reshape和transpose的区别
  17. Excel数据分析实战之开宗明义: Excel与数据分析实战
  18. 在Ubuntu下安装vim
  19. 希腊字母以及发音 α β γ
  20. vim 匹配行首到某个特定字符

热门文章

  1. 七旬老人献出治疗肝炎及肝硬化腹水的民间秘方
  2. 区间之和 (sdut oj)
  3. LinuxI/O多路复用转接服务器——epoll模型实现
  4. js 判断16种风向角度
  5. Vue 开发环境搭建(Mac 版)
  6. 西门子1200程序与威纶通实例,设备已经运行生产,博图V15
  7. SQL:多表级联查询数量时避免笛卡尔积
  8. VMware虚拟机的快照了解一下
  9. Excel常用功能之一
  10. 移动计算技术--AODV(Ad hoc 按需距离矢量法)