cmake java_JNI系列之AS支持CMake了
写在前面
Android Studio 2.2+已支持CMake编译,与以前NDK-Build方式相比方便了不少,本文旨在引导大家在AS2.2+下一步一步建立JNI工程进行开发,并假设大家已经对JNI相关知识有所了解,不作代码解释,文末附代码GitHub地址。
AS更新之前进行JNI开发需要配置指定的Gradle版本(还是实验版本),参见链接,相对应的HelloWorld工程已上传,下载地址,本文抛开NDK-Build,使用最新的CMake工具链新建工程,大家各取所需。
开始分割线,严肃脸
建立工程
新建工程,勾选Include C++ Support
选择Toolchain Default
Android视图
Project视图
0)HelloWorld
编写JNIInterface.java
public class JNIInterface {
static {
// 库名下文提及
System.loadLibrary("com_hayukleung_jni_JNIInterface");
}
public native String stringFromJNI();
}
为方便快速编写JNIInterface对应的C头文件,我写了一个shell脚本,放置于工程根目录,修改里面的路径常量后,运行即可生成。
./jni_header_generator.sh com/hayukleung/jni/JNIInterface.java com.hayukleung.jni.JNIInterface
得到的C头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_hayukleung_jni_JNIInterface */
#ifndef _Included_com_hayukleung_jni_JNIInterface
#define _Included_com_hayukleung_jni_JNIInterface
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hayukleung_jni_JNIInterface
* Method: stringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_hayukleung_jni_JNIInterface_stringFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
拷贝该头文件,后缀改为.c或.cpp,实现函数Java_com_hayukleung_jni_JNIInterface_stringFromJNI
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "com_hayukleung_jni_JNIInterface.h"
/* Header for class com_hayukleung_jni_JNIInterface */
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_hayukleung_jni_JNIInterface
* Method: stringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
Java_com_hayukleung_jni_JNIInterface_stringFromJNI(JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env, "JNIInterface-->HelloWorld");
}
#ifdef __cplusplus
}
#endif
打开CMakeLists.txt,将com_hayukleung_jni_JNIInterface.c文件路径添加进去,生成的库名建议与该文件一致,不至于与其它库混淆
add_library( com_hayukleung_jni_JNIInterface // 生成的库的库名
SHARED
src/main/cpp/com_hayukleung_jni_JNIInterface.c ) // 路径
写个Activity展示这个字符串
public class CallbackActivity extends AppCompatActivity {
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text = new TextView(this);
text.setText(new JNIInterface().stringFromJNI());
setContentView(text);
}
}
编译,运行,结束。
1)JAVA调用C/C++函数
这里我们以一个斐波那契数列的计算为例子,使用C/C++编写函数计算数列,JAVA端调用并显示结果
不贴代码了,文末附GitHub地址
2)C/C++调用JAVA方法
不贴代码了,这里写了三个JAVA方法供C调用,函数签名如下
// 函数签名:()V
void func();
// 函数签名:(I)V
void func(int);
// 函数签名:(Ljava/lang/String;)V
void func(String);
附录
Java类型
对应的签名
例子
boolean
Z
byte
B
char
C
short
S
int
I
long
L
float
F
double
D
void
V
Object
L用/分割包的完整类名;
Ljava/lang/String;
Array
[签名
[I or [Ljava/lang/String;
cmake java_JNI系列之AS支持CMake了相关推荐
- Mesalink v1.0.0 发布,正式支持 TLS 1.3 和 IPv6,支持CMake编译,支持Windows,实现生产环境可用...
百度智能云 云生态狂欢季 热门云产品1折起>>> MesaLink TLS是百度安全实验室研发的下一代传输层安全(Transport Layer Security, TLS)库. ...
- CMake系列(八) CMake 多级目录
CMake系列(八) CMake 多级目录 文章目录 CMake系列(八) CMake 多级目录 目录结构 结构说明 调用关系 源文件 CMakeLists.txt 最外层CMakeLists mai ...
- 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )
文章目录 一.Android Studio 中使用 CMake 编译单个 C++ 源文件 二.cmake_minimum_required 命令设置最小 CMake 版本 三.project 命令设置 ...
- cmake could not find openssl_使用CMake构建C++项目
背景 现代CMake如今开始转向使用targets和properties,比如下面文章介绍的这样: https://pabloariasal.github.io/2018/02/19/its-time ...
- 现代 CMake 简明教程(一)- CMake 基础
系列文章目录 现代 CMake 简明教程(一)- CMake 基础 现代 CMake 简明教程(二)- 设计理念与使用 文章目录 系列文章目录 前言 CMake 基础 1. Modern CMake ...
- 【CMake】CMake 引入 ( Android NDK 构建脚本 | CMake 命令手册 )
文章目录 一.Android NDK 构建脚本 二.CMake 构建脚本示例 三.CMake 命令手册 1.CMake 脚本命令 2.CMake 工程命令 该系列博客的应用场景是 Android St ...
- CMake基础 第1节 初识CMake
介绍# 本节展示一个非常基本的hello world的例子. 本节中的文件如下: A-hello-cmake$ tree . ├── CMakeLists.txt ├── main.cpp [CMak ...
- C++ CMake入门和进阶(二):CMake语法
CMake也是有语法的,这里总结一些.CMake系列学习个人笔记: C++ CMake入门和进阶(一):使用CMake编译项目 文章目录 输出 message 分支 if/elseif/else/en ...
- cmake导入so库_通过CMake方式生成动态库so文件
JNITest 通过CMake方式生成动态库so文件 简介 Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的 ...
最新文章
- android 打包 混淆配置_android 实际项目中混淆文件的配置(参考做法)
- Visual Studio 快捷键
- 点击鼠标左键 自动锁定计算机图标,鼠标一按左键桌面图标就消失了怎么办_为什么按鼠标左键时桌面图标都不见了...
- python图形编程复选按钮和单选按钮详细说明_Python_tkinter_单选框(Radiobutton)与复选框(Checkbutton)...
- SAP收购sysbase
- windows游戏编程_2020年适合程序员编程的笔记本电脑推荐
- SQL-SERVER2008登录错误233
- CentOS下MFS分布式文件系统搭建
- UML类图(类关系的表示)
- Vue异步组件Demo 1
- psp c语言编程软件,PSP2000自制系统3.03OE-C如何傻瓜安装及系统测试
- sumif单列求和_Sumif、Sumifs单列多条件求和-阿里云开发者社区
- 台式计算机刚做完系统就蓝屏,做完系统蓝屏怎么办|刚做完系统重启电脑蓝屏解决方法...
- 【T-Star赛事笔记】腾讯安全应急响应中心(TSRC)+WriteUp赛题四+比赛评价+小彩蛋--by wjl110
- # 支持向量机+hog特征实现手势识别
- 为什么亿万资产的投资者依旧对加密货币长期走势持乐观态度?
- 几种常用的传播木马的方法
- matlab离群值处理,数据平滑和离群值检测
- MTK androiod5.1源码精简系统APP
- 从零开始实现放置游戏(一)——游戏设计
热门文章
- PyTorch学习笔记——softmax和log_softmax的区别、CrossEntropyLoss() 与 NLLLoss() 的区别、log似然代价函数...
- LeetCode简单题之位1的个数
- 常用语义分割小样本模型
- CVPR2020论文点评: AdderNet(加法网络)
- 2021年大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
- Python数据挖掘:数据转换-数据规范化
- TypeError: to_bytes() missing required argument ‘byteorder‘ (pos 2)
- TypeError: can only concatenate str (not “int“) to str
- Android 自定义ProgressBar 实现进度圆环
- (八)pdf的构成之文件体(page属性)