如何利用C生成.so供Mono调用
来源:互联网 发布:wifi测试软件 编辑:程序博客网 时间:2024/04/30 05:26
Mono诞生的初衷是为了吸引更多的Windows .Net程序员来加入Linux平台的开发。但在Linux世界中C语言依然是
主流。很多时候一些关键应用(比如大型 笛卡儿 乘积运算、需要调用平台硬件功能的时候)不得不依赖C来完成。
这个时候 Mono 多少显得有些力不从心。
当然可以使用DLLImport特性来完成对本地库(.so)的调用。现在来讲讲如何生成自己的本地库,并在Mono中调用
首先,先用 C 写一个简单的函数,这个函数只用来把2个整形的形参相加之后返回结果。
//the file name is sum.c
#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
OK.现在我们准备生成一个名为 libsum.so 的目标本地库。使用 GCC 编译器来编译生成我们要的结果
gcc -Wall -fPIC -O2 -c -o libsum.o sum.c //生成.o
gcc -shared -Wl,-soname,libsum.so -o libsum.so libsum.o //这步才生成共享库 .so 文件
这个时候已经生成 libsum.so。然后可以在 Mono 中使用它了。
using System;
using System.Runtime.InteropServices;
public class UnsafeDemo
{
[DllImport ("libsum.so", EntryPoint="sum")]//一定要指定EntryPoint
static extern int sum(int a, int b);
unsafe static void Main()
{
int x = sum(23, 45);
Console.WriteLine("x: {0}", x);
}
}
之后可以编译我们的程序:
$ mcs --unsafe UnsafeDemo.cs
$ mono UnsafeDemo.exe
如果在编译程序的时候提示没找到 libsum.so ,你可以把 libsum.so 放到与 UnsafeDemo.exe 同级的目录下面试试。
如果还不成功也可以参照我的这篇文章, good luck!
http://blog.csdn.net/zhangjianying/archive/2006/09/04/1177049.aspx
最后提醒一点写 C 的时候记住一点。C 是用返回值来判断是否发生错误。而 Mono 是用异常。
//C code segment
int debug (char *s)
{
printf("Output: %s/n", s);
return -1;
}
//mono code segment
[DllImport ("libsum.so", EntryPoint="debug")]
static extern int debug(string sb);
unsafe static void Main()
{
int x = debug("hello");
if (x)
{
// succeeded
}
else
{
// failed
throw new YouException();
}
}
- 如何利用C生成.so供Mono调用
- 如何利用C生成.so供Mono调用
- 如何利用C生成.so供Mono调用
- 如何调用已有的SO文件来生成供Android使用的SO文件
- 生成so库供Java调用
- Linux下编译安装OpenCV(基于C++,生成so库供python调用)
- C语言生成DLL供C#调用
- c 生成.so 文件及 python 调用.so
- 如何生成供VS2010调用的OpenCV3.0库文件
- C生成DLL供C#或VB调用
- android中用ndk编译c代码为so库,供jni调用(一)
- 利用Java注解将常量类生成js文件供前端调用
- Android_10_java调用C(借助NDK工具自动生成.so)
- Linux C:生成、调用静态库/动态库,.a,.so
- LINUX下PHP生成并调用C的.so文件
- php调用C语言生成的so文件
- C/C++ 生成的.so文件,python 用ctypes调用
- mac下lua调用c生成的so文件
- gawk使用简介
- hibernate3 关系映射 使用说明
- 认识JAVA
- 网络游戏制作技术(一)
- 网络游戏制作技术(二)
- 如何利用C生成.so供Mono调用
- 网络游戏制作技术(三)
- 网络游戏制作技术(四)
- 网络游戏制作技术(五)
- 关于Java栈与堆
- 网络游戏制作技术(六)
- Oracle用户名的修改方法
- 该死的病毒
- 归纳Java中的Interface(接口)