在计算机世界里,几乎所有设备都能支持直接 运行c++ 、c 编译出来的可执行文件,因为他们编译出后的文件里面包含的实际是执行机器能直接识别的指令集命令,如裸机程序,或者操作系统程序。
执行这个可执行文件的进程称为 native 进程,一般称为本地natvie进程。
而使用 java 编译的出来的程序文件 如jar 包,却是不能直接运行在目标机器上的。他们需要运行在特定的java虚拟机里,虚拟机从本质上将,实际上也是一个 使用 c\c++ 实现的一个 本地程序......
废话不多说,下面直接举例说明如何在c++ 里 直接通过实例化虚拟机来直接运行java代码,使c++ ,java 达到融为一体的效果。
涉及到的所有文件如下:
1、主要的java 文件:
2,主要的c++ 文件
3,编译后运行的日志
4,简要说明
如运行日志显示,一个进程号(3597)里 有c++ 代码的打印(app2, ppp)、也有java代码的打印(java),
在一个进程里,无缝衔接的实现了 从执行 c++ 代码-----> 直接过度到 ----> 执行 java 代码 程序流程。
其中,java 代码里能使用了Android 封装的android.util.Log 类,是因为实例的c++ 代码里特地注册了这个java类对应的native 方法,如果没有注册,则会像日志里显示的异常信息一样报错:No implementation found for boolean android.os.SystemProperties.native_get_boolean。
因此这个地方也可以直接使用Android 封装好的 libandroid_runtime.so 库,但是里面封装死了jni的操作,仅透露了几个有限的接口,这是直接使用别人的库的缺点,
但是它却加载了完整Android java程序运行需要依赖的类对应的native方法。看运用场景吧,没有优劣之分。
另外,实例代码里也使用了 Android封装好的 libnative_helper 库,这个库的目的是为了帮助开发者更容易、方便的实例化 虚拟机、使用虚拟机实现自己要的功能。