纠结的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, 32768,0,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, 32768,0,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,0,buf_size);
    gcroot<BinaryWriter ^>* wr=(gcroot<BinaryWriter ^>*) opaque;
    BinaryWriter ^writeStream= *wr;
    writeStream->Write(mbuf,0,buf_size);
    writeStream->Flush();
    return 0;
}

总结

就俩字:坑爹


纠结的CLI C++与Native C++的交互,布布扣,bubuko.com

时间: 2024-09-30 16:17:22

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

native与web交互的那些事儿

项目中经常会出现需要native和web交互的地方,我推荐两种方法.一种是通过JavaScriptCore,一种是通过拦截网络请求的方式 第一种方式 1.先介绍几个名词: JSContext:给JavaScript提供运行的上下文环境 JSValue:JavaScript和Objective-C数据和方法的桥梁 JSExport:这是一个协议,如果采用协议的方法交互,自己定义的协议必须遵守此协议 2.先来看个html <html> <head> <meta charset=&

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

一. 原生代码中直接加载页面 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webView { NSString* htmlPath = [[NSBundle mainBundle]pathForResource:@"demo" ofType:@"html"]; NSString* appHtml =[NSString stringWithContent

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

http://www.cppblog.com/mzty/archive/2007/12/24/39517.html CLI/C++中混合类的使用 一 混合类 所谓混合类是指CLI/C++中native的Class中可以包含CLR对象,CLR的class也可以包含Naitve的对象. 1)native的class中包含CLR对象,必须通过gcroot<>或auto_gcroot<>.2)CLR中的class中包含native的对象,必须是指针,也可以使用高手写的CAutoNative

React Native在特赞的应用与实践

基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课程介绍: 课程摘要: APP开发技术的选型 React Native开发过程中的主要问题 异常监控.热更新与RN性能优化 距离过年还有一个月不到,产品突然提出一个需求说,咱们要不做一个IOS应用吧,快过年了,给设计师一个新礼物吧.当时我的内心其它是拒绝的,于是我面带微笑着说:“好啊,我们尽量吧...

利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现

0x00 前言 前一段时间分别读了两篇博客,分别是叶小钗兄的<浅谈Hybrid技术的设计与实现>以及徐磊哥的<从技术经理的角度算一算,如何可以多快好省的做个app>.受到了很多启发,同时也有自己的一些看法.因为目前三大平台(虽然wp的份额相对于iOS以及android来说十分可怜)的开发语言分别是Objective-C(swift).Java以及C#,先不论平台的其他特性如何,单单是各个平台开发语言就已经不同了.而往往一个App要同时登陆不同的多个平台,那么如何能够快速的开发跨平台

《React-Native系列》RN与native交互与数据传递

RN怎么与native交互的呢? 下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示. 首先是 Native侧 1.MainActivity package com.rnandroid01; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.Contacts

iOS JS 和 OC交互 / JS 和 native 相互调用

现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native  OC代码 第一种机制 (1)最常用的是 利用 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationT

webApp和Native综合开发一款APP

目前我所在的公司就是有native和H5这块,不得不说H5省了我们很多事情. 只要一套H5,Android和IOS都不用愁了. 目前综合来说单纯的NativeApp和单纯的webApp都不是最佳的.很多公司都是和我们一样使用两者结合. 这个肯定是一个趋势,目前我们的新版本是加入两个活动来推广我们的app,活动这种东西其实用H5实现是最完美的,因为这样不会造成代码的臃肿,活动结束就关闭入口就行,本地代码也不会有多余的. 目前我们实现Native和JS交互的思路. 首先代码互相调用. 请查看我的上篇

webview的javascript与Native code交互

http://my.oschina.net/u/1376187/blog/172296 项目中使用了webview显示网页,其中需要网页和native方法有交互,搜索到一篇文章,转发分享一下: ============================================================================================================================== 转载请注明出处 挺帅的移动开发专栏  http://