纠结的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 ...
随机推荐
- C#中Predicate的一点理解
本人喜欢代码看起来比较优雅,而C#真的是一种很优雅的语言.比如我们New List<string> StrList; 如果我们想查找StrList,可以使用C#提供的 StrList.Fi ...
- 第17章课后题(高级Perl技巧)
17.1 写一个程序,从文件中读取一组字符串(每行一个),然后让用户键入模式以便进行字符串匹配. 对于每个模式,程序应该说明文件里共有多少字符串匹配成功,分别是哪些字符串. 对于所键入的每个新模式,不 ...
- 前端模板文件化jQuery插件 $.loadTemplates
工作中使用前端模板引擎,如 artTemplate.jsRender,来替代拼接字符串. 可是直接把模板写在页面上会带来页面臃肿,模板无法重用,与 ASP.NET等后端语言语法冲突等问题. 所以将多个 ...
- Java包详解
背景: 在java中要求文件名和类名相同,所以如果把多个类放在一起,就可能出现文件名冲突 所以用包来解决,一个包中可以包含多个类 包是java提供的一种用于区别类的名字空间的机制,是类的组织方式,是一 ...
- Connect mysql on Linux from Windows
ON LINUX: 1 sudo apt-get install mysql-server 2 sudo apt-get install python-dev 3 sudo apt-get insta ...
- 在Site Settings下找不到Navigation标签
有时候我们可能找不到Navigation标签, 仅仅在Look and Feel下面看到"Quick launch" 如何才能找到我们想要的"Navigation&quo ...
- 最好用的手机编程软件-C4droid
Q:c4droid是什么? A:c4droid(以下简称c4)是安卓平台上最强大的c/c++ 编译器,你可以在手机上用手机编写自己的C/C++程序,并且可以把程序导出成apk文件. 下载地址:http ...
- c++:参数型别的推导
STL源码剖析--侯捷 总结 尽管现在的很多语言支持参数类型的判别,但是c/c++并不支持这一特性. 但是我们可以通过一些技巧使得c++具有自动判别参数类型的特性. 模板 我们都知道在模板类和模板函数 ...
- java 对象序列化 RMI
对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...
- Catch That Cow
poj3278:http://poj.org/problem?id=3278 题意:给你一个n和k,n可以加1也可以减1,还可以乘2,现在要求n经过这样的几步变换可以使得n==k:求得最小的步数.题解 ...