纠结的CLI C++与Native C++的交互
最近在写点东西,涉及到了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++的交互的更多相关文章
- Android中Native和H5交互
1.概述 时至今日,H5的跨平台性越发凸显优势,一套代码适配android.ios,既能减少开发成本,又便于更新与维护.但是native的性能体验也确实更佳,尤其体现在复杂界面和频繁变化的界面上.事实 ...
- Hybrid App: 看看第三方WebViewJavascriptBridge是如何来实现Native和JavaScript交互
一.简介 在前面两篇文章中已经介绍了Native与JavaScript交互的几种方式,依次是JavaScriptCore框架.UI组件UIWebView.WebKit框架,这几种方式都是苹果公司提供的 ...
- 遇到的C++ cli 转 C++ native 为C# 程序提供接口。
接口文件 /*++ (do not edit the above line) ************************************************************* ...
- C++ / CLI 调用 C++ /Native 随记
C# 封装 原生C++ 方法:1.C++ CLR(托管) 调用 C++(原生)2.C#调用C++ CLR , 注意各个平台编译版本需一致.3.C# 默认编绎生成版本是 any cpu , 需修改成 ...
- Native与H5交互的一些解决方法
一. 原生代码中直接加载页面 1. 具体案例 加载本地/网络HTML5作为功能介绍页 2. 代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webVi ...
- CLI/C++中混合类的使用【转】
http://www.cppblog.com/mzty/archive/2007/12/24/39517.html CLI/C++中混合类的使用 一 混合类 所谓混合类是指CLI/C++中native ...
- 从C++到C++/CLI
本文转载于:https://www.cnblogs.com/feisky/archive/2009/11/22/1607999.html 刘未鹏(pongba) /文 看起来只是在C++后面多写了一个 ...
- 使用TypeScript创建React Native
⒈初始化 React Native环境 参考https://reactnative.cn/docs/getting-started.html ⒉安装React Native官方的脚手架工具 npm i ...
- 基于frida框架Hook native中的函数(1)
作者:H01mes撰写的这篇关于frida框架hook native函数的文章很不错,值得推荐和学习,也感谢原作者. 0x01 前言 关于android的hook以前一直用的xposed来hook j ...
随机推荐
- Spring 创建bean的时机
默认在启动spring容器的时候,spring容器配置文件中的类就已经创建完成对象了 在<bean>中添加属性lazy-init,默认值为false. true 在c ...
- Oracle数据库之rownum
1. 介绍 当我们在做查询时,经常会遇到如查询限定行数或分页查询的需求,MySQL中可以使用LIMIT子句完成,在MSSQL中可以使用TOP子句完成,那么在Oracle中,我们如何实现呢? Oracl ...
- JavaScript 继承机制小记
读<JavaScript: the good parts>, 关于对象继承这块小记一笔: function Base(v){ this.baseValue = v; this.getBas ...
- java File delete 无法删除文件的原因。
windows下使用java.io.File.delete()方法删除文件时,返回值为true. 但是本地文件仍然存在,也就是说没有删除成功. 这时候你要检查下你传进来的文件目录格式是否正确. 正确: ...
- Yii2的相关学习记录,前后台分离及migrate使用(七)
最近一直忙其它的(其实是懒!),将<深入理解Yii2>看了一遍,一些当初没明白的稍微明了了点,然后又看yii2的图片上传等处理.富文本.restful什么的,但由于没进行到这里,只看也不管 ...
- 分数拆分( 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 ...
- 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 ...
- django笔记1
最近在博客园看来越来越多的关于python的文章,我看到时感觉特别的好,因为我也是一个特别喜欢python这门语言,喜欢python的简洁.干净,简洁而不失强大. 最近在学习django的Model模 ...
- elasticsearch 性能优化
#系统默认的最大打开文件数的限制 vi /etc/security/limits.conf * - nproc 50240 * - ...
- UnixODBC
UnixODBC下载安装地址:http://www.unixodbc.org/ DOWNLOAD Distribution Format unixODBC is currently availible ...