Android下用NDK显式调用.so文件初探

来源:互联网 发布:单片机照明控制现状 编辑:程序博客网 时间:2024/06/15 22:02

本人是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 := classTLOCAL_SRC_FILES := classT/$(TARGET_ARCH_ABI)/libclassT.so include $(PREBUILT_SHARED_LIBRARY)
如果要添加多个库则重复

include $(CLEAR_VARS)

include $(PREBUILT_SHARED_LIBRARY)

之间的内容即可

在下目测在编译不同版本时会重复调用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 __cplusplusextern "C" {#endifvoid loadso(){void *handle = dlopen("/data/data/com.example.imptest/lib/libclassT.so", RTLD_LAZY);}}#ifdef __cplusplus}#endif  

之后dlsym,dlclose

的用法和Linux的用法一样,关键是要找准.so的文件。



另我看到说Linux下可以给编译器加参数来在.so中导出类定义,在安卓下我不知如何设置,望有知道的高人不吝赐教,谢谢!





原创粉丝点击