呼唤妖哥呀:C++ builder XE 做Andriod 调用第三方.so的问题

WaveYang 2016-05-07 10:33:31
今天有需求,想做一个小程序,需要访问串口, XE6。
但不知道怎么调用Linux下编好的动态库,以及怎么打包到apk中。
请妖哥及各位兄弟姐妹们指点! 谢谢先。

试了一下,比如库名为test.so, 头文件test.h, 动态库有函数add();

Test1:
1. 新建了一个空的FMX Andriod项目
2. 添加test.so到项目
3. Unit2.cpp 包含头文件“test.h”。
4. Unit2.cpp中添加对fun1()的调用
5. 编译通过。链接失败
[ldandroid Error] C:\Users\Public\Documents\Embarcadero\Studio\14.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: .\Android\Debug\Unit2.o: in function TForm2::TForm2(System::Classes::TComponent*):C:\Users\yb\Documents\Embarcadero\Studio\Projects/Unit2.cpp:16: error: undefined reference to 'add(int, int)'

Test2:
int __fastcall Test()
{
void * libm_handle = NULL;
//float (*cosf_method)(float);
typedef float (*fp)(float);
char *errorInfo;
float result;

fp cosf_method;

// dlopen 函数还会自动解析共享库中的依赖项。这样,如果您打开了一个依赖于其他共享库的对象,它就会自动加载它们。
// 函数返回一个句柄,该句柄用于后续的 API 调用
libm_handle = dlopen("libm.so", RTLD_LAZY );
// 如果返回 NULL 句柄,表示无法找到对象文件,过程结束。否则的话,将会得到对象的一个句柄,可以进一步询问对象
if (!libm_handle){
// 如果返回 NULL 句柄,通过dlerror方法可以取得无法访问对象的原因
//printf("Open Error:%s.\n",dlerror());
ShowMessage(dlerror());
return 0;
}

// 使用 dlsym 函数,尝试解析新打开的对象文件中的符号。您将会得到一个有效的指向该符号的指针,或者是得到一个 NULL 并返回一个错误
cosf_method = (fp)dlsym(libm_handle,"cosf");
errorInfo = (char *)dlerror();// 调用dlerror方法,返回错误信息的同时,内存中的错误信息被清空
if (errorInfo != NULL){
//printf("Dlsym Error:%s.\n",errorInfo);
ShowMessage(errorInfo);
return 0;
}

// 执行“cosf”方法
result = (*cosf_method)(0.5);
ShowMessage(FloatToStr(result));
//printf("result = %f.\n",result);

// 调用 ELF 对象中的目标函数后,通过调用 dlclose 来关闭对它的访问
dlclose(libm_handle);

return 0;
}

测试通过, 但这里用的libm.so 应该是已经在andriod系统里了?
...全文
3164 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2017-06-27
  • 打赏
  • 举报
回复
C++ builder XE 做Android调用第三方.so的问题
过客猫2022 2017-06-27
  • 打赏
  • 举报
回复
so文件,好像要放到指定目录。可以参考一下cocod2dx
过客猫2022 2017-06-27
  • 打赏
  • 举报
回复
楼主,了解一下NDK!
qhc-npl 2016-12-26
  • 打赏
  • 举报
回复
楼主,有更详细的资料吗
hejl286 2016-05-30
  • 打赏
  • 举报
回复
多谢了。刚开始学习
WaveYang 2016-05-24
  • 打赏
  • 举报
回复
实践证明,Linux下的很多库,anriod下都是可以用的。 因为它们都是一个系列的内核。 尤其是.a。 .so有可能跟工具链不同有关而不能调用成功,报告缺些依赖的.so什么的。
titan_ysl 2016-05-18
  • 打赏
  • 举报
回复
Linux下的.so和.a库文件应不能在安卓下用吧,安卓的NDK编译出来的这些文件和Linux下的是不一样的,函数的依赖的基础库不同,且编译时选择的处理器架构也不一定是相同的。 我在安卓SDK程序中,调用了windows的API,可能安卓没有此API,结果编译通过了,实际使用时,却没反应。
WaveYang 2016-05-18
  • 打赏
  • 举报
回复
还是自己解决了。 方法一是用.a, 静态库。 二是放到系统路径里。 没有人拿分呀。
WaveYang 2016-05-18
  • 打赏
  • 举报
回复
路过的同学,支持一下,来接点分赛!
WaveYang 2016-05-08
  • 打赏
  • 举报
回复
自己顶一下。 没有人用过么?

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧