问题标签 [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.
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
,如下所示:
我不知道我能在这里做什么......我的意思是,这只是基本代码......
objective-c - 行代码在 lldb `p` 中工作,代码在托管单元测试中失败
我发现了很多关于该NSArray element failed to match the Swift Array Element type
错误的帖子。但是,我仍然无法让它工作。我怀疑这个问题与我所做的目标 C 框架绑定有关,而不是铸造问题。除其他外,我不明白的一件事是为什么代码在 lldbp
指令中工作,而不是作为在主机 ios 应用程序中执行的单元测试(否则我无法测试它,因为代码需要 B-LE 无法从iphone模拟器)。
奇怪的是我能够使该行在 lldb 中工作,如下图所示。
编辑:由于我有多次反对票,我希望能解释一下为什么 lldb 行在主执行崩溃时在评论中起作用。如果是类型转换问题,我认为 lldb 行将不起作用。我发现的相关问题都没有回答这个问题。我承认我是一个 swift/objc 新手,如果这不是与 objc-swift 框架映射过程相关的问题,可能有一些我不明白的事情。
该getMuses
函数由 djinni 使用我编写的模块映射包装,用于将专有的目标 C 框架绑定到 swift。这是我写的模块图。我对其他函数绑定没有任何问题(见评论)。删除该[system]
属性不会触发任何其他警告。
djinni 生成的声明:
原始的 objc 声明:
该定义不可用,因为该框架是专有的。
返回的指针不太可能为 null 或指出错误的内存地址,因为 lldb 对屏幕截图中显示的 getName 方法的调用不会给出正确的结果。
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 如下:
任何帮助表示赞赏。
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
用适当的值替换用户名和节点版本。
我希望这个问题保持开放,以提出一个更好的选择来否定这个设置。
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 的目的和模式,所以也许有更好的方法来实现我想要做的事情?
android - 一个简单的 hello-world 与 djinni 被困在构建 djinni 中。这可能是什么原因?
我是 djinni 的新手,我正在检查它的工作原理并想做一些hello-world
事情。所以从他们的github repo中,我复制了以下代码片段:
命名此文件hello-world.djinni
并运行以下命令:
但我不确定这是否正确?它一直停留在以下位置:
而且我认为它不会取得进展。我只是想用多种语言生成东西,看看它的样子。有什么我想念的吗?我已经分叉了djinni react native并将hello-world.djinni
文件保存在根目录。
c++ - Djinni 记录可以包含可选的接口字段吗
此代码在 Djinni 中是否有效,并且some_record
可以为目标 c 生成?
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
c++ - 在 xcode 中使用 djinni 时“使用未声明的标识符”“noreturn”
我正在使用一个名为 djinni 的库,它连接到我的 iOS 代码并允许我在 iOS 和 Android 中运行相同的 c++ 代码。我遇到的问题是我已将其附加到我正在处理的旧 xcode 项目中,并且在 djinni 代码中出现错误。
我看到 4 个错误,所有这些都是“使用未声明的标识符 'noreturn'”
可以看到这些的一个例子是:
带有“[[noreturn]]”的两行都会引发此错误。有没有我忽略的项目设置?我的 main.m 已重命名为 main.mm,并且所有 djinni 编译源都添加了 -fobjc-arc。