JNI入门课程-第二章:JNI基础调用
序章:
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基础调用相关推荐
- JavaSE入门0基础笔记 第二章Java基础语法
JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...
- 尚硅谷Java入门视频教程第二章——Java基本语法
尚硅谷Java入门视频教程第二章 第一章复习 课后习题 Java语言概述 第2章:Java基本语法 2.1 关键字和保留字 2.2 标识符(Identifier) 2.3 变量 2.3.1 变量基本概 ...
- pandas 第二章 pandas基础
第二章 pandas基础 import numpy as np import pandas as pd import xlrd 在开始学习前,请保证pandas的版本号不低于如下所示的版本,否则请务必 ...
- 【python第一章 基础捋顺,第二章 python基础语法】
第一章 基础捋顺,第二章 python基础语法 第一章 基础捋顺 第二章 python基础语法 2.1输入输出 2.2代码注释 2.3代码缩进 2.4命名规范 2.5变量 2.6基本数据类型 2.7数 ...
- 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记4:第二章 NumPy基础3——数组的组合、分割,数组转换为列表
第二章 NumPy基础3 本章示例代码中的输入和输出均来自IPython会话. 2.7 数组的组合 NumPy数组有水平组合.垂直组合和深度组合等多种组合方式,我们将使用vstack.dstack. ...
- 鸟哥的Linux私房菜(服务器)- 第二章、基础网络概念
第二章.基础网络概念 最近更新日期:2011/07/15 你的服务器是放在网络网络上面来提供服务的,所以,如果没有网络或者是网络不通,那么你的服务器当然是英雄无用武之地啦! 此外,服务器上面的网络服务 ...
- 《机器学习系列教程》:第二章 机器学习基础
第二章 机器学习基础 机器学习and 数据分析 2.2 监督学习.非监督学习.半监督学习.弱监督学习? 根据数据类型的不同,对一个问题的建模有不同的方式.依据不同的学习方式和输入数据,机器学习主要分为 ...
- Datawhale数据分析课程第二章
Datawhale数据分析课程第二章 准备工作 数据清洗及特征处理 相关定义 缺失值观察与处理 任务一:缺失值观察 (1) 请查看每个特征缺失值个数 (2) 请查看Age, Cabin, Embark ...
- Python面试宝典(第二章 Python基础)
Python面试宝典(第二章 Python基础) Python面试宝典(第二章 Python基础) 基础语法 输入输出 问题:代码中要修改不可变数据会出现什么问题? 抛出什么异常? 问题:a=1,b= ...
最新文章
- iOS9 This application is modifying the autolayout engine from a background thread, which
- hls.js播放hls直播源
- Jmeter内置函数功能(五)
- WinForm编程数据视图之DataGridView浅析
- 加载场景不销毁的实现
- 微软已暂时停用你的帐户_Apple ID 被停用如何解决?
- android圆形头像 demo,Android图像处理之绘制圆形头像
- MyBatis-Plus_查询返回实体对象还是map?
- html标签info,HtmlTrInfo 元素
- USGS下载遥感影像——以Landsat影像下载为例
- 如何将.sql文件导入数据库
- matlab中变压器的仿真,基于MATLAB的稳压变压器建模与仿真
- Microbiome:鸡肠道微生物宏基因集(张和平、魏泓、秦楠点评)
- Unity Editor 基础篇(三):自定义窗口
- c++11 日期和时间工具(std::chrono::duration)(三)
- 深度学习中框架中reshape和transpose的区别
- Excel数据分析实战之开宗明义: Excel与数据分析实战
- 在Ubuntu下安装vim
- 希腊字母以及发音 α β γ
- vim 匹配行首到某个特定字符