本人是Windows程序猿出身,比较喜欢Windows下的.lib和.dll体制,转到Cocos2dx后也想尝试这种体制,刚刚研究了下把自己写的.so引入Android工程并显式调用(用dlopen函数打开),有了点结果特地写出来。
自己写的.so要通知Android工程,不然编译时不会放进apk文件里的,就算你把文件放进libs目录也不行。
具体办法是在项目的jni目录下建立一个prebuild目录,把.so文件放进去,如下所示
图上可以看出有多个平台的文件在相对应的目录里。
编写Android.mk文件放在prebuild目录下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := classT
LOCAL_SRC_FILES := classT/$(TARGET_ARCH_ABI)/libclassT.so
include $(PREBUILT_SHARED_LIBRARY)
如果要添加多个库则重复
include $(CLEAR_VARS) 【此处存疑!】
include $(PREBUILT_SHARED_LIBRARY)
之间的内容即可
应该是使用多行的LOCAL_MOUDLE和LOCAL_SRC_FILES(以" \"分割)才对吧
在下目测在编译不同版本时会重复调用Android.mk,所以$(TARGET_ARCH_ABI)/libclassT.so 只用写一遍即可。
之后在jni目录下(一般NDK开发设置下)的Android.mk的最后添加
include $(LOCAL_PATH)/prebuild/android.mk
由于我是要动态调用so,所以LOCAL_SHARED_LIBRARIES是屏蔽的。
调用.so文件的C代码大致如下:
#include <jni.h>
#include <dlfcn.h>
#ifdef __cplusplus
extern "C" {
#endif
void loadso()
{
void *handle = dlopen("/data/data/com.example.imptest/lib/libclassT.so", RTLD_LAZY);
}
}
#ifdef __cplusplus
}
#endif
之后dlsym,dlclose
的用法和Linux的用法一样,关键是要找准.so的文件。
另我看到说Linux下可以给编译器加参数来在.so中导出类定义,在安卓下我不知如何设置,望有知道的高人不吝赐教,谢谢!