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

本人是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中导出类定义,在安卓下我不知如何设置,望有知道的高人不吝赐教,谢谢!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值