djinni使用实践(二) -- djinni究竟都有哪些配置选项

7 篇文章 0 订阅
7 篇文章 0 订阅

djinni使用实践(一) -- 官方文档

djinni使用实践(二) -- djinni究竟都有哪些配置选项

 djinni使用实践(三)--Android项目中的使用

上一篇是官方文档的中文译文方便大家查阅,这一篇整理下djinni究竟都有哪些配置选项,大家也可以在djinni项目根目录下运行命令查看。

src/run --help
Already up to date: Djinni
Usage: djinni [options]

  --help
        
  --idl test.djinni
        此命令后接我们自己写的idl文件,后缀名为“.djinni”,如:test.djinni,需要注意的是要加上相对路径
  --idl-include-path <path> ...
        用于搜索 Djinni @import 指令的包含路径, 可以指定多个路径。

  --java-out ../test/java
        Java 文件的输出路径(如果未指定,则禁用生成器)。
  --java-package com.test.hello
        用于生成的 Java 类的包名。
  --java-class-access-modifier <public/package>
        用于生成的 Java 类的访问修饰符(默认:public)。
  --java-cpp-exception <exception-class>
        Java 中已翻译的 C++ 异常的类型(默认值:未检查的 java.lang.RuntimeException),即c++中出错报哪种异常,可默认也可是自定义的异常类(全类名)
  --java-annotation com.alibaba.android.arouter.facade.annotation.Route
        在所有生成的 Java 类上添加注释 (如@Route),
  --java-generate-interfaces <true/false>
        是否应尽可能使用 Java 接口而不是抽象类(默认值:false)。
  --java-nullable-annotation <nullable-annotation-class>
        Java 注释 (@Nullable) 放置在所有字段上并返回可选值,如:androidx.annotation.Nullable
  --java-nonnull-annotation <nonnull-annotation-class>
        Java 注释 (@Nonnull) 放置在所有字段上并返回非可选值,同上
  --java-implement-android-os-parcelable <true/false>
        所有生成的 java 类都将实现接口 android.os.Parcelable
  --java-use-final-for-record <true/false>
        为生成的 Java 类是否应标记为“final”(默认值:true)。

  --cpp-out <out-folder>
        C++ 文件的输出文件夹(如果未指定,则禁用生成器)。
  --cpp-header-out <out-folder>
        C++ 头文件的输出文件夹(默认值:与 --cpp-out 相同)。
  --cpp-include-prefix <prefix>
        C++ 文件中头文件的#includes 前缀。
  --cpp-namespace hello::test
        用于生成的 C++ 类的命名空间名称。
  --cpp-ext cpp
        C++ 文件的文件扩展名(默认:“cpp”)。
  --hpp-ext hpp
        C++ 头文件的文件扩展名(默认:“hpp”)。
  --cpp-optional-template <template>
        用于可选值的模板(默认值:“std::optional”)
  --cpp-optional-header <header>
        用于可选值的标头(默认:“<optional>”)
  --cpp-enum-hash-workaround <true/false>
       通过为 C++ 枚举生成 std​​::hash 特化来解决 LWG-2148(默认值:true)
  --cpp-nn-header <header>
        用于不可为空指针的标头
  --cpp-nn-type <header>
        用于不可空指针的类型(作为 std::shared_ptr 的替代品)
  --cpp-nn-check-expression <header>
        用于构建不可为空指针的表达式
  --cpp-use-wide-strings <true/false>
        在 C++ 代码中使用宽字符串(默认值:false)

  --jni-out <out-folder>
        JNI C++ 输出文件的文件夹(如果未指定,则禁用生成器)。
  --jni-header-out <out-folder>
        JNI C++ 头文件的文件夹(默认值:与 --jni-out 相同)。
  --jni-include-prefix <prefix>
        JNI C++ 文件中 JNI 头文件的 #includes 前缀。
  --jni-include-cpp-prefix <prefix>
        JNI C++ 文件中主要头文件的#includes 前缀。
  --jni-namespace ...
        用于生成的 JNI C++ 类的命名空间名称。
  --jni-base-lib-include-prefix ...
       JNI 基础库的包含路径,相对于 JNI C++ 类。

  --objc-out <out-folder>
        Objective-C 文件的输出文件夹(如果未指定,则禁用生成器)。
  --objc-h-ext <ext>
        Objective-C[++] 头文件的文件扩展名(默认:“h”)
  --objc-type-prefix <pre>
        Objective-C 数据类型的前缀(通常是两个或三个字母)
  --objc-include-prefix <prefix>
        来自 Objective-C 文件的 #import 头文件的前缀。
  --objc-swift-bridging-header <name>
        在 XCode 的 Swift 项目中使用的 Objective-C Bridging Header 的名称。
  --objc-closed-enums <true/false>
        所有生成的 Objective-C 枚举都是 NS_CLOSED_ENUM(默认值:false)。 

  --objcpp-out <out-folder>
        私有 Objective-C++ 文件的输出文件夹(如果未指定,则禁用生成器)。
  --objcpp-ext <ext>
        Objective-C++ 文件的文件扩展名(默认:“mm”)
  --objcpp-include-prefix <prefix>
       #import of Objective-C++ header files from Objective-C++ files 的前缀。
  --objcpp-include-cpp-prefix <prefix>
        来自 Objective-C++ 文件的主要 C++ 头文件的 #include 前缀。
  --objcpp-include-objc-prefix <prefix>
        Objective-C++文件中Objective-C头文件的#import前缀(默认:与--objcpp-include-prefix相同)
  --cpp-extended-record-include-prefix <prefix>
        扩展记录 C++ 标头 (.hpp) 文件的 #include 前缀路径
  --objc-extended-record-include-prefix <prefix>
        扩展记录 Objective-C 标头 (.h) 文件的 #import 前缀路径
  --objcpp-namespace <prefix>
        用于生成的 Objective-C++ 类的命名空间名称。
  --objc-base-lib-include-prefix ...
        Objective-C++ 基础库的包含路径,相对于 Objective-C++ 类。

  --yaml-out <out-folder>
       YAML 文件的输出文件夹(如果未指定,则禁用生成器)。
  --yaml-out-file <out-file>
        如果指定所有类型将合并到一个 YAML 文件中,而不是为每种类型生成一个文件(相对于 --yaml-out)。
  --yaml-prefix <pre>
        添加到存储在 YAML 文件中的类型名称的前缀(默认值:“”)。

  --list-in-files <list-in-files>
        在其中写入解析的输入文件列表的可选文件。
  --list-out-files <list-out-files>
        在其中写入生成的输出文件列表的可选文件。
  --skip-generation <true/false>
        指定是否应跳过文件生成的方式(默认值:false)

以下各项可设置的命名风格 (ex: "FooBar", "fooBar", "foo_bar", "FOO_BAR", "m_fooBar")

  --ident-java-enum ...
        
  --ident-java-field ...
        
  --ident-java-type ...
        
  --ident-cpp-enum ...
        
  --ident-cpp-field ...
        
  --ident-cpp-method ...
        
  --ident-cpp-type ...
        
  --ident-cpp-enum-type ...
        
  --ident-cpp-type-param ...
        
  --ident-cpp-local ...
        
  --ident-cpp-file ...
        
  --ident-jni-class ...
        
  --ident-jni-file ...
        
  --ident-objc-enum ...
        
  --ident-objc-field ...
        
  --ident-objc-method ...
        
  --ident-objc-type ...
        
  --ident-objc-type-param ...
        
  --ident-objc-local ...
        
  --ident-objc-file ...
        

也不是很多,大家用到时查阅就可以了。

### 回答1: 在 Djinni 中,可以使用 `std::string` 的构造函数来把 `std::vector<uint8_t>` 转换为 `std::string`。例如: ```cpp std::vector<uint8_t> buffer = …; std::string str(buffer.begin(), buffer.end()); ``` 注意,这种方法只适用于转换包含 ASCII 字符的 buffer,如果 buffer 中包含非 ASCII 字符,则会出现乱码。如果需要转换含有非 ASCII 字符的 buffer,则需要使用适当的字符编码,例如 UTF-8。可以使用以下代码来转换包含 UTF-8 编码的 buffer: ```cpp std::vector<uint8_t> buffer = …; std::string str(buffer.begin(), buffer.end()); std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; std::wstring wide_str = converter.from_bytes(str); std::string utf8_str(wide_str.begin(), wide_str.end()); ``` 这里假设 buffer 中的字符均为 UTF-8 编码。如果 buffer 使用了其他字符编码,则需要使用对应的转换器来完成转换。 ### 回答2: 在Djinni中,将缓冲区转换为字符串的过程分为两个步骤。首先,通过将缓冲区的内容复制到一个临时`std::string`对象中来读取缓冲区的内容。然后,使用Djinni提供的转换函数将临时字符串转换为可在不同编程语言间传递的字符串类型。 为了将缓冲区转换为字符串,我们可以使用以下示例代码: ```cpp // 将缓冲区转换为字符串 std::string bufferToString(const djinni::ByteBuffer& buffer) { // 通过将缓冲区的内容复制到一个临时std::string对象中,读取缓冲区的内容 std::string tempString(buffer.begin(), buffer.end()); // 使用Djinni提供的转换函数将临时字符串转换为可传递给不同编程语言的字符串类型 djinni::String convertedString = djinni::String::fromCpp(tempString); // 返回转换后的字符串 return convertedString; } ``` 在这个函数中,我们首先将缓冲区的内容复制到一个临时`std::string`对象中,通过使用`buffer.begin()`和`buffer.end()`迭代器将缓冲区的开始和结束位置传递给构造函数。然后,我们使用Djinni提供的`fromCpp()`函数将临时字符串转换为可传递给其他编程语言的字符串类型。最后,我们将转换后的字符串返回。 以上是在Djinni中将缓冲区转换为字符串的简单示例。请注意,实际实现可能会依赖于具体的编程语言和使用的编译器/工具链。 ### 回答3: 在Djinni中,将buffer转换为string的过程如下所示: 1. 首先,需要根据不同的编程语言选择适当的方法。Djinni支持不同的编程语言,如C++、Java和Objective-C等。 2. 如果在C++中使用Djinni,可以使用std::string类来表示字符串。可以通过将buffer的数据逐字节复制到std::string对象中来完成转换。 3. 如果在Java使用Djinni,可以使用java.nio.charset包中的Charset和CharsetDecoder类来实现转换。首先,需要确定使用哪种字符编码。然后,可以通过创建ByteBuffer对象,将buffer中的数据写入其中,并通过CharsetDecoder对象将其解码为字符串。 4. 如果在Objective-C中使用Djinni,可以使用NSString类来表示字符串。可以通过将buffer的数据转换为NSData对象,然后使用NSString的initWithData:encoding:方法将其解码为字符串。 需要注意的是,要正确转换buffer为string,必须确保buffer中的数据编码方式与字符串需要的编码方式一致。否则,可能会导致乱码或转换错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值