移植libaiq到Android studio中
在工程中创建一个jni目录用于保存头文件和cpp以及需要连接的rkaiq库,将libaiq从系统中pull出来,放到jniLibs目录下,librkaiq头文件位于external/camera_engine_rkaiq/include/目录下,在jni创建一个include目录,并将librkaiq的头文件拷贝到这个目录下,如下:
搭建环境
创建一个FocusJni类来调用JNI接口,并通过javac -h生成头文件,将头文件拷贝到jni目录下,然后编写一个Android.mk来链接rkaiq库和编译自己的so库
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnirkaiq
LOCAL_SRC_FILES := jniLibs/arm64-v8a/librkaiq.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := Focusapi
LOCAL_SRC_FILES := focusapi.cpp
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := \
include \
include/xcore \
include/xcore/base \
include/common \
include/common/mediactl \
include/algos \
include/iq_parser \
include/iq_parser_v2 \
include/iq_parser_v2/j2s \
include/uAPI2 \
include/ipc_server
LOCAL_SHARED_LIBRARIES := jnirkaiq
include $(BUILD_SHARED_LIBRARY)
并且需要再build.gadle加上以下部分:
externalNativeBuild {
ndkBuild{
path file("src/main/jni/Android.mk")
}
报错
在环境搭建完成后,调用rkaiq时报了一下错误信息:
由于rkaiq会依赖系统的libutils.so、libcutils.so库,查看/system/etc/public.libraries.txt和/vendor/etc/public.libraries.txt文件中列举的so库,根据链接器命名空间的限制规则APP进程默认只允许打开这些系统so库(通过java调用System.loadLibrary和native调用dlopen)。
解决方法:
--- a/rootdir/etc/public.libraries.android.txt
+++ b/rootdir/etc/public.libraries.android.txt
@@ -28,3 +28,5 @@ libsync.so
libvulkan.so
libwebviewchromium_plat_support.so
libz.so
+libutils.so
+libcutils.so