最近在写点东西,涉及到了CLR C++与Native C++的互相调用的问题,结果...........纠结啊。

交互原型

交互原型是这样的:

void* avio_alloc_context(
unsigned char *buffer,
int buffer_size,
int write_flag,
void *opaque,
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int64_t (*seek)(void *opaque, int64_t offset, int whence));

第一次尝试

public ref class test
{
int Writebuffer(void *opaque,libffmpeg::uint8_t* buf, int buf_size){
} main()
{
test testobj=gcnew test();
libffmpeg::avio_alloc_context(outbuffer, ,,NULL ,NULL,testobj->Writebuffer ,NULL);
}

结果报错,要求创建指向成员的指针。

第二次尝试

使用了委托,然后使用  Marshal::GetFunctionPointerForDelegate获取函数指针结果....

编译不报错了,运行时回调倒是有了,可回调函数return后就报错..........估计是对象回收或者是非法访问导致。

第三次尝试

直接构造了静态函数

int static Writebuffer(void *opaque,libffmpeg::uint8_t* buf, int buf_size)

这个可以正常回调了,运行也不报错,可我需要的对象在静态函数中可获取不到(为了多线程考虑,不能用全局对象)。

于是需要传入 void *opaque 参数。

但是这个要传的是一个托管对象,咋办呢?使用pin_ptr,嗯,可以传进去。

呃,新的问题来了,void *怎转回托管对象呢?好吧,这个我是没找到合适的办法,

再次失败.........

第四次尝试

找到了gcroot<>这个模版,必须有这个:#include<vcclr.h>

代码:

public ref class test
{
gcroot<BinaryWriter^> _writedStream;
int static Writebuffer(void *opaque,libffmpeg::uint8_t* buf, int buf_size){
}

好吧,斜体部分报错,说是托管类中不能使用非托管对象........

再改:

gcroot<BinaryWriter^>* _writedStream;

这次不报错了。

继续:

Open( BinaryWriter^ writer)
{
*_writedStream=writer;
}

结果运行时告诉我找不到对象....好吧,还需要初始化:

_writedStream=new gcroot<BinaryWriter ^>;
*_writedStream=writer;

这次终于木有问题了............

avio_alloc_context(outbuffer, ,,this->_writedStream ,NULL,this->Write_buffer ,NULL);

Write_buffer(void *opaque,libffmpeg::uint8_t* buf, int buf_size){
array<unsigned char>^ mbuf=gcnew array<unsigned char>(buf_size);
System::Runtime::InteropServices::Marshal::Copy((IntPtr)buf,mbuf,,buf_size);
gcroot<BinaryWriter ^>* wr=(gcroot<BinaryWriter ^>*) opaque;
BinaryWriter ^writeStream= *wr;
writeStream->Write(mbuf,,buf_size);
writeStream->Flush();
return ;
}

总结

就俩字:坑爹

												

纠结的CLI C++与Native C++的交互的更多相关文章

  1. Android中Native和H5交互

    1.概述 时至今日,H5的跨平台性越发凸显优势,一套代码适配android.ios,既能减少开发成本,又便于更新与维护.但是native的性能体验也确实更佳,尤其体现在复杂界面和频繁变化的界面上.事实 ...

  2. Hybrid App: 看看第三方WebViewJavascriptBridge是如何来实现Native和JavaScript交互

    一.简介 在前面两篇文章中已经介绍了Native与JavaScript交互的几种方式,依次是JavaScriptCore框架.UI组件UIWebView.WebKit框架,这几种方式都是苹果公司提供的 ...

  3. 遇到的C++ cli 转 C++ native 为C# 程序提供接口。

    接口文件 /*++ (do not edit the above line) ************************************************************* ...

  4. C++ / CLI 调用 C++ /Native 随记

    C# 封装 原生C++ 方法:1.C++ CLR(托管)  调用 C++(原生)2.C#调用C++ CLR ,  注意各个平台编译版本需一致.3.C# 默认编绎生成版本是 any cpu , 需修改成 ...

  5. Native与H5交互的一些解决方法

    一. 原生代码中直接加载页面 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webVi ...

  6. CLI/C++中混合类的使用【转】

    http://www.cppblog.com/mzty/archive/2007/12/24/39517.html CLI/C++中混合类的使用 一 混合类 所谓混合类是指CLI/C++中native ...

  7. 从C++到C++/CLI

    本文转载于:https://www.cnblogs.com/feisky/archive/2009/11/22/1607999.html 刘未鹏(pongba) /文 看起来只是在C++后面多写了一个 ...

  8. 使用TypeScript创建React Native

    ⒈初始化 React Native环境 参考https://reactnative.cn/docs/getting-started.html ⒉安装React Native官方的脚手架工具 npm i ...

  9. 基于frida框架Hook native中的函数(1)

    作者:H01mes撰写的这篇关于frida框架hook native函数的文章很不错,值得推荐和学习,也感谢原作者. 0x01 前言 关于android的hook以前一直用的xposed来hook j ...

随机推荐

  1. Spring 创建bean的时机

    默认在启动spring容器的时候,spring容器配置文件中的类就已经创建完成对象了        在<bean>中添加属性lazy-init,默认值为false.    true  在c ...

  2. Oracle数据库之rownum

    1. 介绍 当我们在做查询时,经常会遇到如查询限定行数或分页查询的需求,MySQL中可以使用LIMIT子句完成,在MSSQL中可以使用TOP子句完成,那么在Oracle中,我们如何实现呢? Oracl ...

  3. JavaScript 继承机制小记

    读<JavaScript: the good parts>, 关于对象继承这块小记一笔: function Base(v){ this.baseValue = v; this.getBas ...

  4. java File delete 无法删除文件的原因。

    windows下使用java.io.File.delete()方法删除文件时,返回值为true. 但是本地文件仍然存在,也就是说没有删除成功. 这时候你要检查下你传进来的文件目录格式是否正确. 正确: ...

  5. Yii2的相关学习记录,前后台分离及migrate使用(七)

    最近一直忙其它的(其实是懒!),将<深入理解Yii2>看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理.富文本.restful什么的,但由于没进行到这里,只看也不管 ...

  6. 分数拆分( Fractions Again, UVA 10976)-ACM

    It is easy to see that for every fraction in the form  (k > 0), we can always find two positive i ...

  7. python连接mysql之pymysql模块

    以下demo均以python2中的mysqldb模块 一.插入数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import MySQLdb    conn = MyS ...

  8. django笔记1

    最近在博客园看来越来越多的关于python的文章,我看到时感觉特别的好,因为我也是一个特别喜欢python这门语言,喜欢python的简洁.干净,简洁而不失强大. 最近在学习django的Model模 ...

  9. elasticsearch 性能优化

    #系统默认的最大打开文件数的限制 vi /etc/security/limits.conf   *     -       nproc          50240    *     -       ...

  10. UnixODBC

    UnixODBC下载安装地址:http://www.unixodbc.org/ DOWNLOAD Distribution Format unixODBC is currently availible ...