android 加载第三方库

来源:互联网 发布:脉诀汇辨 知乎 编辑:程序博客网 时间:2024/04/30 14:04

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := cal
LOCAL_SRC_FILES := ./libcal.so

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../sum/jni/

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := call

LOCAL_SRC_FILES:= \
call.cpp
(warning(LOCAL_SRC_FILES))

LOCAL_LDLIBS := -llog -lz -lm
$(warning aaa)
LOCAL_SHARED_LIBRARIES := cal #这里记得加上

APP_ABI := armeabi-v7a
APP_PLATFORM := android-14
LOCAL_MODULE_TAGS := optional

include $(BUILD_EXECUTABLE)
采用这种方法只能是在存在android代码情况下才能用,也就是System.loadLibrary(“cal”); System.loadLibrary(“call”);这个时候才能用,如果libcall.so变成了一个可执行程序”call”,那么不能这样只写,运行时会出现找不到第三方库, 原因是第三方库的路径并不在系统搜索路径下面,Android.mk中到现在我也不知道怎么指定一个搜索路径, 在LOCAL_LDLIBS后面加上-L./也不管用。

改进方法直接采用动态加载第三方库,这样写mk的时候不需要写任何和第三方有关的东西(需要头文件的话,另算),然后在dlopen的时候写一个绝对路径:

if((handle = dlopen("/data/libcal.so", RTLD_NOW)) == NULL) {        LOGE("dlopen - %sn", dlerror());        exit(-1);}

这样就不会出现找不到库的问题了

0 0