[迅为开发板教程]嵌入式学习之安卓JNI开发教程(二)
转自迅为开发板安卓JNI开发指南
硬件平台:迅为iTOP-412开发板
B站搜索:北京迅为,免费观看同步视频教程:
https://www.bilibili.com/video/BV18v411i7Dx
学习内容:
1. jni简介和Android Studio环境搭建
2. 分析jni例子并仿写
3. 使用编译好的so库
分析例子的 JNI 代码
上一节我们了解我们创建的这个工程这样的一个 JNI 架构,那么这一节我们来编译一个自己的 so 库, 要编译自己的 so 库,我们就要先来写一个 JNI 的代码,所以我们先来一起分析下他给我们的这个例子的代 码,如下图所示:
避免编译器按照 C++的方法来编译 C 函数
extern "C"
关键字 JNIEXPORT 的作用是表示这个函数可以被其他的函数调用,这个有点类似于 C++的 PUBLIC 修饰符JNIEXPORT北京迅为电子有限公司
www.topeetboard.com
10
关键字 JNICALL 为空,没有含义 JNICALL 关键字定义如下
关键字 jstring 表示的是字符串类型,与之类似的还有 jint,jchar,与之 c 语言对应的类型就是 int 和 char jstringJava_com_example_jnitest_MainActivity_stringFromJNI 是函数名的名称,这个我们不能随便定义,我们使 用的是静态注册,所以他有格式要求,与之对应的还有动态注册,这里我们不做介绍。
格式:Java _包名 _ 类名_Java 需要调用的方法名
按照这个格式我们可以知道,包名为 com_example_jnitest,也就是 MainActivity 所在的包名,如下图所示:
类名为 MainActivity,也就是定义 native 函数的类,也就是 MainActivity,如下图所示:
Java 需要调用的方法名为 stringFromJNI,也就是我们定义的 public native String stringFromJNI(),如下图所示:
参数 JNIEnv* env,与 java 进行交互的相关的函数 JNIEnv* env 定义如下:
参数 jobject,代表 native 函数的 java 类的实例。
定义了一个字符串 Hello from C++,并返回这个字符串
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());