【问题标题】:How to add Java annotations to JNI SWIG API?如何将 Java 注释添加到 JNI SWIG API?
【发布时间】:2019-09-15 07:38:39
【问题描述】:

我们正在使用 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 智能功能变得更加困难。

【问题讨论】:

    标签: java android kotlin swig java-annotations


    【解决方案1】:

    在名为 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;
    %}
    

    【讨论】:

    • 这个解决方案有效,但它有两个缺点:1)它非常具体,我必须为我使用的每种类型添加一个%typemap@Nullable(如果我想添加@NonNull 这将是一个更大的痛苦)。 2) 代码未编译,因为缺少 android.support.annotation 的导入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多