데이터 유형

HIDL 인터페이스 파일에서 자바 HIDL 백엔드는 자바 인터페이스, 스터브 및 프록시 코드를 생성합니다. 이는 모든 스칼라 HIDL 유형([u]int{8,16,32,64}_t, float, double,, enum) 그리고 문자열, 인터페이스, safe_union 유형, 구조체 유형 및 지원되는 HIDL 유형의 배열과 벡터를 지원합니다. 자바 HIDL 백엔드는 union 유형 또는 fmq 유형을 지원하지 않습니다. Android 11에서는 memoryhandle 유형 지원을 추가했습니다.

자바 런타임은 기본적으로 부호 없는 정수 개념을 지원하지 않으므로 모든 부호 없는 유형과 이를 기반으로 하는 enum은 부호 있는 등가물로 자동 처리됩니다. 즉, uint32_t는 자바 인터페이스에서 int가 됩니다. 값이 변환되지 않습니다. 자바측의 구현자는 부호가 없는 것처럼 부호 있는 값을 사용해야 합니다.

Enum

enum은 자바 enum 클래스를 생성하지 않고 각 enum 케이스에 대해 정적 상수 정의가 포함된 내부 클래스로 변환됩니다. enum 클래스가 다른 enum 클래스에서 파생되면 해당 클래스의 저장소 유형을 상속합니다. 부호 없는 정수 유형을 기반으로 하는 열거는 부호 있는 등가물로 다시 작성됩니다. 기본 유형은 프리미티브이므로 0인 열거자가 없는 경우에도 enum 필드/변수의 기본값은 0입니다.

예를 들어 uint8_t 유형이 있는 SomeBaseEnum과 같습니다.

enum SomeBaseEnum : uint8_t { foo = 3 };
enum SomeEnum : SomeBaseEnum {
    quux = 33,
    goober = 127
};

다음과 같이 변환됩니다.

public final class SomeBaseEnum { public static final byte foo = 3; }
public final class SomeEnum {
    public static final byte foo = 3;
    public static final byte quux = 33;
    public static final byte goober = 127;
}

그리고 다음은

enum SomeEnum : uint8_t {
    FIRST_CASE = 10,
    SECOND_CASE = 192
};

다음과 같이 다시 작성됩니다.

public final class SomeEnum {
    static public final byte FIRST_CASE  = 10;  // no change
    static public final byte SECOND_CASE = -64;
}

문자열

자바의 String은 utf-8 또는 utf-16이지만 전송 시 일반적인 HIDL 유형으로 utf-8로 변환됩니다. 또한 HIDL로 전달되는 String은 null이 아니어야 합니다.

핸들 및 메모리

Android 11에서는 handlememory 유형에 자바를 지원합니다. 이들은 각각 android.os.NativeHandleandroid.os.HidlMemory로 변환됩니다. null 핸들은 유효하다고 인식되지만 null 메모리는 그렇지 않습니다.

생성된 서버 코드에서 수신한 메모리 및 핸들 인수는 메서드 호출 범위 내에서만 유효합니다. 서버 구현이 전체 기간을 연장하려는 경우 dup() 메서드를 각각 사용하여 복제해야 합니다. 반환된 인스턴스는 메서드 호출 외에도 사용할 수 있으며 완료되면 적절하게 종료되어야 합니다.

생성된 클라이언트 코드에 호출된 메서드의 입력 인수로 전송된 핸들 및 메모리 인스턴스는 복제하거나 메서드 반환 후에도 유효하도록 유지되지 않아도 됩니다. 하지만 출력 인수로 수신된 핸들 및 메모리 인스턴스는 자동 생성된 코드로 자동 복제되며 작업이 완료되면 적절하게 종료되어야 합니다. 이러한 반환 인수가 메서드의 반환 값으로 표시되거나(단일 반환 값 케이스의 경우) 동기식 콜백 스타일을 사용하는지(여러 반환 값 케이스에 사용됨)에 관계없이 true입니다.

복사 및 종료에 관한 자세한 내용은 자바 클래스 관련 문서를 참조하세요.

배열 및 벡터

배열은 자바 배열로 변환되고 벡터는 ArrayList<T>로 변환됩니다. 여기서 T는 vec<int32_t> => ArrayList<Integer>와 같은 스칼라 유형을 래핑할 수 있는 적절한 객체 유형입니다. 예를 들면 다음과 같습니다.

takeAnArray(int32_t[3] array);
returnAVector() generates (vec<int32_t> result);

다음과 같이 변환됩니다.

void takeAnArray(int[] array);
ArrayList<Integer> returnAVector();

구조

구조는 유사한 레이아웃을 가진 자바 클래스로 변환됩니다. 예를 들면 다음과 같습니다.

struct Bar {
 vec<bool> someBools;
};
struct Foo {
 int32_t a;
 int8_t b;
 float[10] c;
 Bar d;
};

다음과 같이 변환됩니다.

class Bar {
 public final ArrayList<Boolean> someBools = new ArrayList();
};
class Foo {
 public int a;
 public byte b;
 public final float[] c = new float[10];
 public final Bar d = new Bar();
}

선언된 유형

types.hal에서 선언된 각 최상위 유형은 자바에서 요구하는 대로 자체 .java 출력 파일을 가져옵니다. 예를 들어 다음 types.hal 파일은 추가 파일 두 개(Foo.java 및 Bar.java)를 만듭니다.

struct Foo {
 ...
};

struct Bar {
 ...

 struct Baz {
 };

 ...
};

Baz의 정의는 Bar의 정적 내부 클래스(Bar.java에 있음)에 있습니다.