问题标签 [language-interoperability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1983 浏览

objective-c - 如何从 Swift 扩展访问 Objective-C 类的私有成员?

我正在尝试在 Swift 中扩展一个 Objective-C 类并使其符合Equatable协议。这需要访问扩展类的一些私有成员,编译器不允许我这样做。不公开私人成员的正确方法是什么?

我的斯威夫特代码:

目标-C:

我得到的错误:

ShortDate.swift:26:9:“ShortDate”没有名为“组件”的成员

0 投票
4 回答
2001 浏览

c# - 在 C# winforms 中使用 C++ 库

我正在尝试在 OpenTK 中使用 SPARK 粒子系统。
我的项目包含文件夹中的头文件,只有两个头文件只包含其他头文件,并且文件夹也包含源文件。
到目前为止,我已经尝试了几种方法,但没有任何方法对我有用,这些是我尝试过的:

1. P/调用

这是在您的 C++ 项目中编写一些代码,这些代码构建了 dll,然后使用DllImportC# 中的属性(显然需要using System.Runtime.InteropServices;)。我发现这不适用于类的困难方式,它只适用于类外的方法,所以这种方法是无效的。

2. 包装类

这是编写一个包含指向原始类的指针的类。我发现困难实际上来自于从托管代码调用非托管代码(没有自动内存管理),这就是需要包装类的原因,这就是为什么您必须重新定义方法的签名并让它们调用原始方法的原因。

当然这有一些好处,比如以更好的方式命名类和方法,但是库太大了,你可以看到这样做的努力。

3. 使用自动包装:

这是一个很好的方法,尤其是使用 xInterop++。我对此非常乐观,并认为它会起作用,它说“给我 .h 文件和 dll,我会为你构建 .NET dll”。很好,但这样做会出错;简单来说:

您必须确保 .h 文件和 dll 是一致的,并且该库在 C++ 项目中工作。

我已经尝试了几件事来处理这个错误:

  1. 知道 dll 包含什么:正如我从谷歌搜索和从这个站点中学到的那样,这很困难,所以我的尝试失败了。
  2. 将头文件放入新项目并构建它:收到错误,修复它们,然后构建项目并且运行良好。我将带有头文件的 dll 文件上传到 xInterop。然后它告诉找到的类,但会说什么也没找到!我搜索并了解到编译器必须通过使用以下语句标记所需的每个类来告诉编译器需要由 dll 公开哪些类_declspec(dllexport)
  3. 我使用 Find & Replace 修复了这个问题并再次尝试并显示了类,所以我启动了 xInterop 并收到了同样的错误。
  4. 它要求确保 dll 正常工作。在验证文件工作正常后,我启动了程序并产生了链接器错误。

这是我卡住的地方,这些是我得到的链接器错误:

main.obj:错误 LNK2019:未解析的外部符号“void __cdecl SPK::swapParticles(class SPK::Particle &,class SPK::Particle &)”(?swapParticles@SPK@@YAXAAVParticle@1@0@Z) 中引用函数“私有:void __thiscall SPK::Pool::swapElements(类 SPK::Particle &,类 SPK::Particle &)”(?swapElements@?$Pool@VParticle@SPK@@@SPK@@AAEXAAVParticle@2@ 0@Z) main.obj:错误 LNK2001:未解析的外部符号“unsigned int SPK::randomSeed” (?randomSeed@SPK@@3IA) main.obj:错误 LNK2001:未解析的外部符号“unsigned long const SPK::NO_ID” (?NO_ID@SPK@@3KB) main.obj : 错误 LNK2001: 无法解析的外部符号 "public: static float const * const SPK::Transformable::IDENTITY" (?IDENTITY@Transformable@SPK@@2QBMB)

这是产生这些错误的代码:

所以这是我的问题,很抱歉解释太多,但我已经进行了三天的搜索,但没有找到任何解决方案。

PS:

图书馆非常大,因此必须使用自动解决方案。

0 投票
0 回答
1119 浏览

c++ - Fortran-C++ 互操作性:通过 void 指针传递数组

我大致有以下情况。我有一个从 Fortran 代码调用的 C++ 函数,它接受一个函数指针和一个 void 指针作为这样的参数

这是像这样从 Fortran 调用的

我想通过函数指针传递的 Fortran 函数看起来像

如果我开始整个事情CPPFunction似乎被正确调用,它会调用FORTRANFUNCTION并且我得到一个异常代码

正好在FORTRANFUNCTION第一次访问数组数据的那一行。

有人能告诉我我的错误在哪里吗?我还应该提到 C++ 函数不是我的。更改它并非不可能,但它会影响许多其他代码。Fortan 部分完全在我的控制之下,我可以用它做我想做的事。

谢谢你。

0 投票
1 回答
3092 浏览

java - 互操作性 java 和 c++

我想用两种不同的语言 java 和 c++ 编写一个程序,它需要在其 c++ 组件和 java 组件之间进行动态和交互式通信。我知道有 jni 和 jna 用于在 java 中调用本机方法,但我认为这种方法不合适为了我的目的。

例如:说一个程序,它的用户界面是用 c++ 编写的,而其他是用 java 编写的,我认为这两个组件的通信不能通过 jni 和 jna 来完成。例如 Open Office 是用 java 和 c++ 编写的。我在互联网上搜索并找到了一些进程间通信的方法,如共享内存、管道、信号、消息传递……但我不知道进程间通信是我需要的。似乎ipc用于在两个不同的进程中通信软件,但我的程序都是一个进程(我是对的吗?!)

所以我的问题是:其组件用不同语言编写的程序如何相互通信?我怎么能做到这一点?

0 投票
0 回答
533 浏览

python - 使用两个或多个输出参数从 MATLAB 调用 Python 函数

在 Matlab 中调用 Python 函数时遇到问题。这个问题已经在这个网站上得到了回答,从 MATLAB 调用 python 函数,但是解决方案对我来说不可用。

上面介绍的主题是在 Matlab 中使用 Python 脚本的几种方法。但是我需要找到一种方法来从我在 MATLAB 中获得的 Python 脚本中获得多个输出参数。

这边走 :

上述方法不能将两个或多个参数的数据返回到 Matlab 中!我想在 MATLAB 中得到一些参数。我正在寻找类似于上述或简单方法的简单方法!

解决方案是什么?

对不起我的英语不好。我是德国人。

0 投票
4 回答
3794 浏览

ios - Swift & Objective-C 项目 - 生成 -Swift.h 错误 - 找不到 UIViewController 的接口声明

我有一个使用 Swift 生成的桥接头的项目,并且项目设置正确(名称中没有空格,使用模块,在我的 .mm 文件中预先声明 Swift 类,删除派生数据,进行干净的重建等。 .)。桥接头生成良好,但自动生成的 -Swift.h 中有错误。更糟糕的是,这些错误出现在 AppDelegate 和 ViewController 的生成(在项目创建中 - Swift)版本上,通常可以正常编译。-Swift.h 中的错误是:

  • @interface AppDelegate : UIResponder <UIApplicationDelegate>
    >> 找不到“UIResponder”的接口声明,“AppDelegate”的超类
    >> 找不到“UIApplicationDelegate”的协议声明
  • @interface ViewController : UIViewController
    >> 找不到“UIViewController”的接口声明,“ViewController”的超类

我搜索了 Stack Overflow 和网络,但找不到任何解决此特定问题的答案。其他人有这个吗?或者,有没有一种方法可以标记我的 AppDelegate 和 ViewController 类,这样 Xcode就不会尝试为这些 Swift 类创建 Objective-C 存根,因为我实际上并不需要它们?

0 投票
2 回答
2568 浏览

c - 如何将 Swift 字符串数组传递给采用 char ** 参数的 C 函数

我正在尝试与 Swift 的旧 C 终端应用程序进行交互。我已成功集成源代码并将标头从 C 桥接到 Swift。该代码从 Xcode 6.3 beta 编译和运行。我已将终端应用程序的主入口点重命名为:

不过,我正在努力将参数从 Swift 传递给这个 C 函数。我的挑战是以正确的格式转换参数。来自 Swift 的典型输入如下所示:

我试过弄乱“cStringUsingEncoding(NSUTF8StringEncoding)”和“withUnsafePointer”,但到目前为止还没有运气。任何帮助是极大的赞赏!

0 投票
1 回答
7610 浏览

c - 涉及 C.free() 的 C 和 Go 互操作性问题

我有一个 Go 函数,它包装了proc_name(pid,...)来自lib_proc.h.

这是完整的C 原型

可以在这里找到/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/libproc.h(至少在我的系统上)。

它遵循 Go 代码:

C.free(unsafe.Pointer(...))除非删除对andimport "unsafe"子句 的调用,否则此代码不会编译。DarwinProcess::NameOf(pid)方法仅适用于Mac OS X,如果从代码中删除,它实际上可以工作。C.free(...)

go build我收到以下错误消息后的实际形式:( could not determine kind of name for C.free仅此而已,这是整个编译器输出)。

删除C.free(...)对我来说是不可接受的,我必须找到如何正确释放分配给C.CString().

我很困惑,因为根据文档,一切都做得很好。我无法找到解决方案,也无法在这里或网络上搜索。

0 投票
1 回答
466 浏览

c - 强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构

与 C 代码互操作时,我无法直接转换结构,我不得不在 Go 中定义一个等效的结构。来自的 C 函数libproc.h

的 C 结构flavor==PROC_PIDTASKINFO定义proc_taskinfosys/proc_info.h(包含在中libproc.h):

即使 Go 代码确实有效,我也无法C.proc_taskinfo直接使用。Go 函数是propertiesOf():完整的源代码在这里

如果我引用 C 结构,我会收到与我关于该主题的最新问题could not determine kind of name for C.proc_taskinfo中报告的类似错误: ,但这次我确定定义是使用#include.

0 投票
2 回答
593 浏览

objective-c - 可互操作的 Obj-C typedef NS_ENUM 到 swift

在我的 Objective-C.h文件中,我定义了:

如何访问 Swift 代码中的枚举?

我尝试使用点运算符 asRTSpinKitViewStyle.RTSpinKitViewStyleCircleFlip但它显示编译错误

“RTSpinKitViewStyle.Type 没有成员类型名称 RTSpinKitViewStyleCircleFlip”。