问题标签 [djinni]

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 投票
1 回答
297 浏览

objective-c - djinni 创建的 Objective-C 协议不起作用

我正在使用 djinni 在 c++、java 和目标 c 之间创建跨平台代码,因为我目前正在将大量代码移动到跨平台 c++ 实现中。

问题是,我有一个接口,它是目标 c 中的协议。另一个用 c++ 实现的接口将这个协议的实现作为参数,然后调用该方法。但是这个方法在目标 c 中根本没有被调用。(更快,但我也尝试在目标 c 中实现此协议,但不起作用)。我已经调查了更多,但首先是我的代码。

为了查看我的问题是否是由现有代码引起的,我创建了一个测试项目,但它仍然是这样的:

所以这是我给 djinni 的 idl 文件:

这是创建的 c++ 文件:

数据提供者.hpp:

数据用户.hpp:

这是我DataUser在 C++ 中的接口和实现:

DataUserImpl.h:

DataUserImpl.cpp:

现在我在 swift 中有这段代码(我也在 Objective C 中尝试过相同的代码,但没有奏效):

问题是,getContentForUrl实现的协议中的方法根本没有被调用。我遇到了崩溃:

Assertion failed: (string), function toCpp, file /Path/to/my/project/deps/djinni/support-lib/objc/DJIMarshal+Private.h, line 119.

所以我现在可以说的是,字符串似乎是null并且我的协议实现没有被调用。

好的,所以我下来看看到底发生了什么:

在为此生成的文件中DataProvider+Private.mm,如下所示:

我不知道我能在这里做什么......我的意思是,这只是基本代码......

0 投票
1 回答
154 浏览

objective-c - 行代码在 lldb `p` 中工作,代码在托管单元测试中失败

我发现了很多关于该NSArray element failed to match the Swift Array Element type错误的帖子。但是,我仍然无法让它工作。我怀疑这个问题与我所做的目标 C 框架绑定有关,而不是铸造问题。除其他外,我不明白的一件事是为什么代码在 lldbp指令中工作,而不是作为在主机 ios 应用程序中执行的单元测试(否则我无法测试它,因为代码需要 B-LE 无法从iphone模拟器)。

奇怪的是我能够使该行在 lldb 中工作,如下图所示。

lldb 工作

编辑:由于我有多次反对票,我希望能解释一下为什么 lldb 行在主执行崩溃时在评论中起作用。如果是类型转换问题,我认为 lldb 行将不起作用。我发现的相关问题都没有回答这个问题。我承认我是一个 swift/objc 新手,如果这不是与 objc-swift 框架映射过程相关的问题,可能有一些我不明白的事情。

getMuses函数由 djinni 使用我编写的模块映射包装,用于将专有的目标 C 框架绑定到 swift。这是我写的模块图。我对其他函数绑定没有任何问题(见评论)。删除该[system]属性不会触发任何其他警告。

djinni 生成的声明:

原始的 objc 声明:

该定义不可用,因为该框架是专有的。

返回的指针不太可能为 null 或指出错误的内存地址,因为 lldb 对屏幕截图中显示的 getName 方法的调用不会给出正确的结果。

0 投票
1 回答
182 浏览

android - 未找到 com.djinnius.HelloWorld$CppProxy 的实现

我正在开发一个使用djinni来使用跨平台原生 C++ 的 React Native 项目。

我已经看过这个问题,但它似乎是一个不同的问题。

该项目成功构建,但在运行时几乎立即失败。

adb logcat显示以下异常:

未找到 com.djinnius.HelloWorld$CppProxy com.djinnius.HelloWorld.create(com.rushingvise.reactcpp.ReactBridge) 的实现(已尝试 Java_com_djinnius_HelloWorld_create 和 Java_com_djinnius_HelloWorld_create__Lcom_rushingvise_reactcpp_ReactBridge_2)

我试图理解tried上面消息中的含义。这是因为 apk 中缺少相应的本机代码吗?或者也许是另一个原因?

完整的 logcat 如下:

任何帮助表示赞赏。

0 投票
0 回答
335 浏览

xcode - 跨平台编译:具有“保留(或强)”属性的属性必须是对象类型

我需要帮助来解密特定 Objective-C++ 文件的编译错误。它包含在 Xcode 项目中。在这种情况下,它编译没有错误。

我已经看到了很多关于这个错误的其他问题,但到目前为止没有一个对我有帮助。

这是 XCode 9.3 生成的命令行,其中我删除了与我的问题无关的选项:

我正在使用node-gyp / djinni以跨平台方式构建相同的代码。这是目标 c gyp 目标:

此目标生成此 clang 命令行:

我再次删除了与问题无关的编译选项。

编译错误是:

错误:具有“保留(或强)”属性的属性必须是对象类型

@property (nonatomic, strong, readonly) dispatch_queue_t methodQueue;

因此,我正在寻找要放置在 .gyp 文件部分“xcode_settings”中的条目以消除此错误。

任何帮助表示赞赏。

编辑:它是一个 Objective-C++ 文件。

编辑2:我已经设法添加-x objective-c++到命令行,但错误仍然存​​在:(

编辑 3:此问题的解决方案是编辑 node-gyp common.gypi 文件以注释/删除以下 xcode.settings:

如果您已全局安装它,它可能位于 /users/ username /.node-gyp/ node-version /include/node

用适当的值替换用户名和节点版本。

我希望这个问题保持开放,以提出一个更好的选择来否定这个设置。

0 投票
1 回答
898 浏览

ios - 使用 react native 解决 iOS 本机模块加载问题

我试图理解其代码由 djinni 生成的iOS 本机模块。

根据 React Native doc,您必须RCT_EXPORT_MODULE()在代码中包含宏。这个工作样本没有。

后来在文档中说例外是 Swift,没有这样的宏。

除非我错了,否则情况并非如此。

我试图在我自己的项目中复制使用 djinni 生成的代码,但是当我运行它时,它失败了,因为 React Native 无法加载我的本机模块:

undefined 不是一个对象(评估 'HelloWorld.getHelloWorld')

我想知道是否可以单步执行 NativeModule 请求代码:

了解发生了什么。

谢谢你的帮助。

0 投票
1 回答
554 浏览

android - 使用 Djinni 替代接口继承

我正在使用 Djinni 在 android 和 ios 之间共享一些大型 c++ 代码库。各种组件之一(我们称之为Foo!!!)在 android 和 ios 上具有不同的实现。Foo是一个接口,c++ 代码无需了解其内部结构就可以使用该接口。

android 实现虽然 ( FooAndroid) 有一些额外的方法,android 客户端可以使用这些方法以仅对 android 平台有意义的方式修改组件的行为。

由于缺乏接口继承,这使 djinni 的事情变得复杂。我想出了一种解决方案,它依赖于这样一个事实,即FooAndroid可以子类化两个不同的 djinni 接口,它们的大多数方法都具有相同的签名,但结果并不漂亮。

这是djinni接口说明:

您会注意到Bar一个只需要访问Foo实例的组件。

然后以这种方式实现生成的接口:

然后我可以通过这种方式在 java 中使用 FooAndroid 和 Bar:

这行得通,但很难看,我必须手动定义两个几乎相同的 djinni 接口,而且我仍然不确定存储该 weak_ptr 对对象生命周期的所有影响。

我觉得我在滥用 Djinni 的目的和模式,所以也许有更好的方法来实现我想要做的事情?

0 投票
0 回答
86 浏览

android - 一个简单的 hello-world 与 djinni 被困在构建 djinni 中。这可能是什么原因?

我是 djinni 的新手,我正在检查它的工作原理并想做一些hello-world事情。所以从他们的github repo中,我复制了以下代码片段:

命名此文件hello-world.djinni并运行以下命令:

但我不确定这是否正确?它一直停留在以下位置:

而且我认为它不会取得进展。我只是想用多种语言生成东西,看看它的样子。有什么我想念的吗?我已经分叉了djinni react native并将hello-world.djinni文件保存在根目录。

0 投票
1 回答
349 浏览

c++ - Djinni 记录可以包含可选的接口字段吗

此代码在 Djinni 中是否有效,并且some_record可以为目标 c 生成?

0 投票
2 回答
914 浏览

c++ - C++/Djinni 错误字段类型是一个抽象类

我正在用 React-native 制作一个应用程序,它使用来自 Dropbox 的 Djinni 在 C++ 和 Javascript 之间架起桥梁。从 Javascript 到 C++ 的调用效果很好,但现在我正在实现从 C++ 到 Java/ObjC 的调用,我的 C++ 技能如此如此。所以我坚持初始化类方法。我基于 Djinni 提供的示例。AnotherClassMain 是从 Javascript 到 C++ 的访问点。

我想从 anotherClassMain 中的 processAImpl 调用 runAProcess 方法。

但我得到错误字段类型'aEditing :: ProcessAImpl'是一个抽象类在ProcesAImpl processA线上; 在另一个ClassMain.hpp

我怎样才能访问这个启动类 processAImpl 并从 anotherClassMain 调用 runAProcess ?

// djinni 创建的 processA.hpp

//processAImpl.hpp

//processAImpl.cpp

//另一个ClassMain.hpp

//另一个ClassMain.cpp

0 投票
1 回答
340 浏览

c++ - 在 xcode 中使用 djinni 时“使用未声明的标识符”“noreturn”

我正在使用一个名为 djinni 的库,它连接到我的 iOS 代码并允许我在 iOS 和 Android 中运行相同的 c++ 代码。我遇到的问题是我已将其附加到我正在处理的旧 xcode 项目中,并且在 djinni 代码中出现错误。

我看到 4 个错误,所有这些都是“使用未声明的标识符 'noreturn'”

可以看到这些的一个例子是:

带有“[[noreturn]]”的两行都会引发此错误。有没有我忽略的项目设置?我的 main.m 已重命名为 main.mm,并且所有 djinni 编译源都添加了 -fobjc-arc。