Android JNI学习02-AndroidStudio3.6JNI示例demo讲解

请看第一个步骤,当执行到stringFromJNI()时,JVM一看,原来是一个native方法,这时,它就会去对应的位置找对应的c++函数。

那么这时,问题就来了,这里的对应位置具体是在哪里呢?

这里的位置实际上就是C++的动态库里,这个动态库等同于java中的jar包,jar包里有编译好的class文件。动态库里同样有提前编译好的c++文件。明白了,是在动态库里找之后,那么这个动态库长什么样子呢?请看下面

以.so结尾的文件,就是动态库,动态库就类似于java中的jar包。
libnative-lib这是动态库的名字,就像jar包的名字一样

可以发现这里有两个动态库,为什么会有两个呢?

这是因为不同的CPU,内置的机器指令不一样。arm64-v8a 和armeabi-v7a,这是两个不同类型的cpu,它们内置的机器指令或多或少有些区别,因此,我们的编译器在编译C++代码时,在arm64-v8a平台上,就要将源代码翻译成针对于这个平台上的机器指令。在armeabi-v7a平台上,就要将源代码翻译成针对于这个平台的机器指令。这也是为什么你会看到有2个动态库的原因。到时程序运行时,在哪个平台上,就加载哪个平台对应的动态库就行。

java是如何加载动态库的

staitc{}在类加载的时候,就会运行。因此在里面加载动态库非常合适。

java如何找到对应的C++函数的

现在我们已经明白了一点,C或者C++编译后的代码是在动态库里,JVM已经能够找到动态库了。但这里有一个问题,动态库里会有很多的函数,那么java应该如何去找到stringFromJNI()所对应的函数的呢?

我们直接来看stirngFromJNI()对应的C++函数

从上图可以发现,java中的方法,想要找到自己对应的C++函数,只需要按照如下格式拼接,就能找到对应的C++函数

java_包的全路径名

Android JNI学习03-AndroidStudio3.6 动手实现一个java调用c++的函数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值