写在前面

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了相关推荐

  1. Mesalink v1.0.0 发布,正式支持 TLS 1.3 和 IPv6,支持CMake编译,支持Windows,实现生产环境可用...

    百度智能云 云生态狂欢季 热门云产品1折起>>>   MesaLink TLS是百度安全实验室研发的下一代传输层安全(Transport Layer Security, TLS)库. ...

  2. CMake系列(八) CMake 多级目录

    CMake系列(八) CMake 多级目录 文章目录 CMake系列(八) CMake 多级目录 目录结构 结构说明 调用关系 源文件 CMakeLists.txt 最外层CMakeLists mai ...

  3. 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )

    文章目录 一.Android Studio 中使用 CMake 编译单个 C++ 源文件 二.cmake_minimum_required 命令设置最小 CMake 版本 三.project 命令设置 ...

  4. cmake could not find openssl_使用CMake构建C++项目

    背景 现代CMake如今开始转向使用targets和properties,比如下面文章介绍的这样: https://pabloariasal.github.io/2018/02/19/its-time ...

  5. 现代 CMake 简明教程(一)- CMake 基础

    系列文章目录 现代 CMake 简明教程(一)- CMake 基础 现代 CMake 简明教程(二)- 设计理念与使用 文章目录 系列文章目录 前言 CMake 基础 1. Modern CMake ...

  6. 【CMake】CMake 引入 ( Android NDK 构建脚本 | CMake 命令手册 )

    文章目录 一.Android NDK 构建脚本 二.CMake 构建脚本示例 三.CMake 命令手册 1.CMake 脚本命令 2.CMake 工程命令 该系列博客的应用场景是 Android St ...

  7. CMake基础 第1节 初识CMake

    介绍# 本节展示一个非常基本的hello world的例子. 本节中的文件如下: A-hello-cmake$ tree . ├── CMakeLists.txt ├── main.cpp [CMak ...

  8. C++ CMake入门和进阶(二):CMake语法

    CMake也是有语法的,这里总结一些.CMake系列学习个人笔记: C++ CMake入门和进阶(一):使用CMake编译项目 文章目录 输出 message 分支 if/elseif/else/en ...

  9. cmake导入so库_通过CMake方式生成动态库so文件

    JNITest 通过CMake方式生成动态库so文件 简介 Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的 ...

最新文章

  1. android 打包 混淆配置_android 实际项目中混淆文件的配置(参考做法)
  2. Visual Studio 快捷键
  3. 点击鼠标左键 自动锁定计算机图标,鼠标一按左键桌面图标就消失了怎么办_为什么按鼠标左键时桌面图标都不见了...
  4. python图形编程复选按钮和单选按钮详细说明_Python_tkinter_单选框(Radiobutton)与复选框(Checkbutton)...
  5. SAP收购sysbase
  6. windows游戏编程_2020年适合程序员编程的笔记本电脑推荐
  7. SQL-SERVER2008登录错误233
  8. CentOS下MFS分布式文件系统搭建
  9. UML类图(类关系的表示)
  10. Vue异步组件Demo 1
  11. psp c语言编程软件,PSP2000自制系统3.03OE-C如何傻瓜安装及系统测试
  12. sumif单列求和_Sumif、Sumifs单列多条件求和-阿里云开发者社区
  13. 台式计算机刚做完系统就蓝屏,做完系统蓝屏怎么办|刚做完系统重启电脑蓝屏解决方法...
  14. 【T-Star赛事笔记】腾讯安全应急响应中心(TSRC)+WriteUp赛题四+比赛评价+小彩蛋--by wjl110
  15. # 支持向量机+hog特征实现手势识别
  16. 为什么亿万资产的投资者依旧对加密货币长期走势持乐观态度?
  17. 几种常用的传播木马的方法
  18. matlab离群值处理,数据平滑和离群值检测
  19. MTK androiod5.1源码精简系统APP
  20. 从零开始实现放置游戏(一)——游戏设计

热门文章

  1. PyTorch学习笔记——softmax和log_softmax的区别、CrossEntropyLoss() 与 NLLLoss() 的区别、log似然代价函数...
  2. LeetCode简单题之位1的个数
  3. 常用语义分割小样本模型
  4. CVPR2020论文点评: AdderNet(加法网络)
  5. 2021年大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
  6. Python数据挖掘:数据转换-数据规范化
  7. TypeError: to_bytes() missing required argument ‘byteorder‘ (pos 2)
  8. TypeError: can only concatenate str (not “int“) to str
  9. Android 自定义ProgressBar 实现进度圆环
  10. (八)pdf的构成之文件体(page属性)