今天要用一个第三方so的功能,自己要写一个JNI的so封装一下。然后把同个SO一起打到APK中。
编译脚本大致是下面这样的,这个网上说的都有。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := libmodule1.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := demo
LOCAL_SRC_FILES := testmain.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := libmodule1
LOCAL_JNI_SHARED_LIBRARIES := libmodule1
include $(BUILD_SHARED_LIBRARY)
我遇到的问题是,在Java代码如果这样写
static {
System.loadLibrary("demo");
}
会出现无法加载libdemo.so,因为它所依赖的libmodule1.so找不到。
后来我打印出System.getProperty("java.library.path"),只有/vendor/lib和/system/lib,而libmodule1.so根本不会在这个目录下,libmodule1.so是和libdemo.so在同一个目录下面的。我把libmodule1.so拷贝到/vendor/lib下面,果然就可以成功加载了。
但是这样拷贝很麻烦。于是我想到这样写:
static {
System.loadLibrary("module1");
System.loadLibrary("demo");
}
这样发现demo可以正常加载了。怪!