首页 新闻 会员 周边 捐助

c#如何调用c++写的so文件

0
悬赏园豆:10 [已解决问题] 解决于 2015-08-24 09:29

得到apk中so文件一个,已知apk中调用方法

System.loadLibrary("md5");

public native String md5(String paramString);

现在想通过c#或者java等语言调用这个so文件中md5方法

试了

[DllImport("libmd5.so", EntryPoint = "md5")]
private static extern string md5(string paramString);  

提示

试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

修改发布为X86还是一样,求解方法

so文件地址:http://pan.baidu.com/s/1kThDh4N 密码 47ww

脚盆男的主页 脚盆男 | 初学一级 | 园豆:6
提问于:2015-08-22 16:28
< >
分享
最佳答案
1

你是在 Linux 下用 C# 调用 .so 吗?

收获园豆:10
Launcher | 高人七级 |园豆:45050 | 2015-08-24 09:05

在windows 下调用

脚盆男 | 园豆:6 (初学一级) | 2015-08-24 09:07

@脚盆男: .so 是 linux 下的动态链接库,无法在 Windows 下使用。

Launcher | 园豆:45050 (高人七级) | 2015-08-24 09:26

@Launcher: 原来如此,怪不得在安卓里才有这东西,谢谢

脚盆男 | 园豆:6 (初学一级) | 2015-08-24 09:29

我在linux下调用啊,该如何调用,现在只有libc调用成功了

 

合纵师 | 园豆:12 (初学一级) | 2016-12-25 16:41
其他回答(1)
0

调用约定  堆栈方面。


1、Cdecl 调用方清理堆栈。 这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法。
2、FastCall 不支持此调用约定。
3、StdCall 被调用方清理堆栈。这是使用平台invoke调用非托管函数的默认约定。
4、ThisCall 第一个参数是 this 指针,它存储在寄存器 ECX 中。 其他参数被推送到堆栈上。 此调用约定用于对从非托管 DLL 导出的类调用方法。
5、Winapi 此成员实际上不是调用约定,而是使用了默认平台调用约定。 例如,在 Windows 上默认为 StdCall,在 Windows CE.NET 上默认为 Cdecl。

 

【DllImport("xx.so", EntryPoint = "playSpecificSound",CallingConvention = CallingConvention.Cdecl】

九环 | 园豆:202 (菜鸟二级) | 2018-05-18 09:54

Linux下如果函数不指定调用约定,默认的情况应该是__attribute__((__cdecl__))

参考博客:

https://blog.csdn.net/codeauth/article/details/6343296

支持(0) 反对(0) 九环 | 园豆:202 (菜鸟二级) | 2018-05-18 09:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册