其他分享
首页 > 其他分享> > JNI(一) JNI - NDK-交叉编译

JNI(一) JNI - NDK-交叉编译

作者:互联网

JNI

1.1 JNI介绍

Java Nativie interface

Java 本地接口,JNI是Java调用本地语言的一种特性。通过Jni 可以使java与本地语言之间相互调用

  • 如java 与c/c++ 相互调用

1.2 实现步骤

1.3 native层通过jni 可以干什么

1.3.1 对类的操作

1.3.2 获取从java层传递过来的参数

1.4 JNI 语法

1.4.1 Native中代码解释

1.4.1.1 extern “C”

1.4.1.2 JNIEXPORT

宏定义:#define JNIEXPORT __attribute__ ((visibility ("default"))) 在 Linux/Unix/Mac os/Android 这种类 Unix 系统中,定义为__attribute__ ((visibility ("default")))

1.4.1.3 JNICALL

宏定义,在 Linux/Unix/Mac os/Android 这种类 Unix 系统中,它是个空的宏定义: #define JNICALL,所以在 android 上删除它也可以

1.4.1.4 thiz

1.4.1.5JNIEnv

1.4.1.6 JavaVM

1.4.1.7 如何在native线程中使用JNIenv

1.5 JNI 注册类型

1.5.1 静态注册

1.5.2 动态注册

1.6 数据类型转换

1.6.1 基本数据类型

java类型nativie类型描述
booleanjbooleanunsigned 8 bits 整型
bytejbytesigned 8 bits 整型
charjcharunsigned 16 bits 整型
shortjshortsigned 16 bits 整型
intjintsigned 32 bits 整型
longjlongsigned 64 bits 整型
floatjfloatsigned 32 bits 浮点型
doublejdoublesigned 64 bits 浮点型
voidvoid无整形

1.6.2 引用数据类型

javanative
objectjobject
java.lang.Class instancejclass
java.lang.String instancejstring
arrayjarray
Object[]jobjectArray
boolean[]jbooleanArray
byte[]jbyteArray
char[]jcharArray
short[]jshortArray
int[]jintArray
long[]jlongArray
float[]jfloatArray
double[]jdoubleArray
java.lang.Throwable objectsjthrowable

1.6.3 函数签名

1.7 JNI引用

局部引用(Local Reference)

全局引用(Global Reference)

弱全局引用(Weak Global Reference)

NDK

简介

Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具,NDK描述的是工具集

是通过jni调用的c/c++的原生代码的

重要结构目录

交叉编译

库文件格式

makefile (.mk) 编译

简介

makefile 就是“自动化编译”:一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,如何进行链接等等操作。 Android 使用 Android.mk 文件来配置 makefile

1.1 Android.mk

1.2 对应Gradle的设置

Cmake 编译

1.1 CMakeLists.txt

1.2 Gradle 中的配置

添加多个源文件

引用三方动态库.so

方式一

方式二

引入so后使用

libtest.so 内存在 test() 函数

情况一 存在test.h

情况二 不存在 test.h

引入静态库 .a

标签:NDK,java,编译,so,env,JNI,JNIEnv,native
来源: https://blog.csdn.net/Applicaton/article/details/122812624