无需JNI调用是指将C/C++代码编译成Linux可执行程序,不需打包成APK或APK + JNI调用。此方式适用于已Root的手机。
这里的使用场景是OpenGL ES作为通用计算单元,只处理数据,不用显示到屏幕。也可以考虑OpenCL、RenderScript,不过OpenCL只有部分Android设备才支持。
运行环境为Android 6.0。
1、Android.mk编译脚本
Android.mk文件内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR-VARS)
LOCAL_MODULE := opengles_module
LOCAL_MODULE_FILENAME := libopengles_module
LOCAL_SRC_FILES := *.cpp
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
LOCAL_LDLIBS += -lGLESv3 -lEGL -landroid
include $(BUILD_EXECUTABLE)
PIE安全机制从4.1引入,Android L之前的系统并不会去检验可执行文件是否基于PIE编译出的,但是Android L已经开启验证,如果调用的可执行文件不是基于PIE方式编译的,则无法运行并提示错误error: only position independent executables (PIE) are supported.。解决办法为在Android.mk中加入LOCAL_LDFLAGS += -pie -fPIE即可。
因