gpt4 book ai didi

java - 如何将 Java 注解添加到 JNI SWIG API?

转载 作者:行者123 更新时间:2023-11-29 23:12:14 25 4
gpt4 key购买 nike

我们正在使用 SWIG 在 Android 中创建 C++ API 与 Java 之间的 JNI API。

例如,假设我们的 C++ 类是:

class TestAnnotation {

public:
void setMessage(char * message);
char * getMessage();

private:
char* message = nullptr;
};

SWIG 生成这个自动生成的 Java 类:

public class TestAnnotation {
...

public void setMessage(String message) {
myJNI.TestAnnotation_setMessage(swigCPtr, this, message);
}

public String getMessage() {
return myJNI.TestAnnotation_getMessage(swigCPtr, this);
}
}

如您所见,message 可以为 null,get 和 set 方法有可能接收/返回 null String(JNI 自动生成的代码行为正如在这种情况下预期的那样,并允许使用 jstringnull)。

我的问题是:SWIG 是否能够添加像 @Nullable@NonNull 这样的注释来匹配 C++ API(如果我们需要向 SWIG 提供“提示”,这也可行)。

因此在这种情况下,所需的自动生成的 Java API 将是:

public class TestAnnotation {
...

public void setMessage(@Nullable String message) {
myJNI.TestAnnotation_setMessage(swigCPtr, this, message);
}

@Nullable
public String getMessage() {
return myJNI.TestAnnotation_getMessage(swigCPtr, this);
}
}

这很重要,因为我们正在将此 Java API 与 Kotlin 结合使用,并且缺少注释使得使用 Kotlin 智能功能变得更加困难。

最佳答案

在名为 test.h 的文件中提供示例 C++ 类,您可以使用以下语法生成带有所需注释的 Java 包装器:

%module test

%javamethodmodifiers TestAnnotation::getMessage() %{
@Nullable
public%};

%typemap(jstype) char *message "@Nullable String";

%include "test.h"

鉴于命名侧重于其他用例,这有点违反直觉,但仍然是完全明智的用法。

当然,您可以通过不命名其中的参数来使输入的类型映射不那么具体(例如 %typame(jstype) char * "...")。

并且您需要使用另一个类型映射来设置导入:

%typemap(javaimports) TestAnnotation %{
import android.support.annotation;
%}

可以通过以下方式使其更通用:

%typemap(javaimports) SWIGTYPE %{
import android.support.annotation;
%}

关于java - 如何将 Java 注解添加到 JNI SWIG API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55856610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com