Skip to content
This repository was archived by the owner on Apr 29, 2024. It is now read-only.

Array signatures fix #105

Merged
merged 6 commits into from
Oct 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions jnigen/example/pdfbox_plugin/src/third_party/pdfbox_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -947,7 +947,7 @@ JniResult PDDocument__load13(jobject input) {
if (_c_PDDocument == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_PDDocument, &_m_PDDocument__load13, "load",
"(L[B;)Lorg/apache/pdfbox/pdmodel/PDDocument;");
"([B)Lorg/apache/pdfbox/pdmodel/PDDocument;");
if (_m_PDDocument__load13 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(
Expand All @@ -965,7 +965,7 @@ JniResult PDDocument__load14(jobject input, jobject password) {
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(
_c_PDDocument, &_m_PDDocument__load14, "load",
"(L[B;Ljava/lang/String;)Lorg/apache/pdfbox/pdmodel/PDDocument;");
"([BLjava/lang/String;)Lorg/apache/pdfbox/pdmodel/PDDocument;");
if (_m_PDDocument__load14 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(
Expand All @@ -985,7 +985,7 @@ JniResult PDDocument__load15(jobject input,
if (_c_PDDocument == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_PDDocument, &_m_PDDocument__load15, "load",
"(L[B;Ljava/lang/String;Ljava/io/InputStream;Ljava/lang/"
"([BLjava/lang/String;Ljava/io/InputStream;Ljava/lang/"
"String;)Lorg/apache/pdfbox/pdmodel/PDDocument;");
if (_m_PDDocument__load15 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
Expand All @@ -1007,10 +1007,10 @@ JniResult PDDocument__load16(jobject input,
load_class_gr(&_c_PDDocument, "org/apache/pdfbox/pdmodel/PDDocument");
if (_c_PDDocument == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_PDDocument, &_m_PDDocument__load16, "load",
"(L[B;Ljava/lang/String;Ljava/io/InputStream;Ljava/lang/"
"String;Lorg/apache/pdfbox/io/MemoryUsageSetting;)Lorg/"
"apache/pdfbox/pdmodel/PDDocument;");
load_static_method(
_c_PDDocument, &_m_PDDocument__load16, "load",
"([BLjava/lang/String;Ljava/io/InputStream;Ljava/lang/String;Lorg/apache/"
"pdfbox/io/MemoryUsageSetting;)Lorg/apache/pdfbox/pdmodel/PDDocument;");
if (_m_PDDocument__load16 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(
Expand Down Expand Up @@ -1355,7 +1355,7 @@ JniResult get_PDDocument__RESERVE_BYTE_RANGE() {
if (_c_PDDocument == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_field(_c_PDDocument, &_f_PDDocument__RESERVE_BYTE_RANGE,
"RESERVE_BYTE_RANGE", "L[I;");
"RESERVE_BYTE_RANGE", "[I");
jobject _result = to_global_ref((*jniEnv)->GetStaticObjectField(
jniEnv, _c_PDDocument, _f_PDDocument__RESERVE_BYTE_RANGE));
return (JniResult){.result = {.l = _result}, .exception = check_exception()};
Expand Down Expand Up @@ -4527,7 +4527,7 @@ JniResult get_PDFTextStripper__LIST_ITEM_EXPRESSIONS() {
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_field(_c_PDFTextStripper,
&_f_PDFTextStripper__LIST_ITEM_EXPRESSIONS,
"LIST_ITEM_EXPRESSIONS", "L[java/lang/String;");
"LIST_ITEM_EXPRESSIONS", "[Ljava/lang/String;");
jobject _result = to_global_ref((*jniEnv)->GetStaticObjectField(
jniEnv, _c_PDFTextStripper, _f_PDFTextStripper__LIST_ITEM_EXPRESSIONS));
return (JniResult){.result = {.l = _result}, .exception = check_exception()};
Expand Down
10 changes: 1 addition & 9 deletions jnigen/lib/src/bindings/c_bindings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ $cReturnType ${cMethodPrefix}_$fieldNameInC($formalArgs) {
$_loadEnvCall
${_loadClassCall(classVar, getInternalName(c.binaryName))}
load_${ifStaticField}field($classVar, &$fieldVar, "$fieldName",
"${_fieldSignature(f)}");
"${getDescriptor(f.type)}");
$accessorStatements
}\n\n''');
}
Expand Down Expand Up @@ -256,14 +256,6 @@ $accessorStatements
'.exception = $exceptionPart};';
}

String _fieldSignature(Field f) {
final internalName = getInternalNameOfUsage(f.type);
if (internalName.length == 1) {
return internalName;
}
return 'L$internalName;';
}

/// Returns capitalized java type name to be used as in call${type}Method
/// or get${type}Field etc..
String _typeNameAtCallSite(TypeUsage type) {
Expand Down
56 changes: 36 additions & 20 deletions jnigen/lib/src/bindings/common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -308,28 +308,52 @@ String getInternalName(String binaryName) {
}
}

String getInternalNameOfUsage(TypeUsage usage,
{bool escapeDollarSign = false}) {
String getSignature(String binaryName) {
switch (binaryName) {
case "void":
return "V";
case "byte":
return "B";
case "char":
return "C";
case "double":
return "D";
case "float":
return "F";
case "int":
return "I";
case "long":
return "J";
case "short":
return "S";
case "boolean":
return "Z";
default:
return 'L${binaryName.replaceAll(".", "/")};';
}
}

String getDescriptor(TypeUsage usage, {bool escapeDollarSign = false}) {
switch (usage.kind) {
case Kind.declared:
return getInternalName((usage.type as DeclaredType).binaryName);
return getSignature((usage.type as DeclaredType).binaryName);
case Kind.primitive:
return getInternalName((usage.type as PrimitiveType).name);
return getSignature((usage.type as PrimitiveType).name);
case Kind.typeVariable:
// It should be possible to compute the erasure of a type
// in parser itself.
// TODO(#23): Use erasure of the type variable here.
// This is just a (wrong) placeholder
return "java/lang/Object";
return "Ljava/lang/Object;";
case Kind.array:
final inner = getInternalNameOfUsage((usage.type as ArrayType).type);
final inner = getDescriptor((usage.type as ArrayType).type);
return "[$inner";
case Kind.wildcard:
final extendsBound = (usage.type as Wildcard).extendsBound;
if (extendsBound != null) {
return getInternalNameOfUsage(extendsBound);
return getDescriptor(extendsBound);
}
return 'java/lang/Object';
return 'Ljava/lang/Object;';
}
}

Expand Down Expand Up @@ -404,19 +428,11 @@ String getJniSignatureForMethod(Method m) {
final s = StringBuffer();
s.write('(');
for (var param in m.params) {
final type = getInternalNameOfUsage(param.type);
s.write(type.length == 1 ? type : 'L$type;');
final type = getDescriptor(param.type);
s.write(type);
}
s.write(')');
final returnType = getInternalNameOfUsage(m.returnType);
s.write(returnType.length == 1 ? returnType : 'L$returnType;');
final returnType = getDescriptor(m.returnType);
s.write(returnType);
return s.toString();
}

String getJniSignatureForField(Field f) {
final internalName = getInternalNameOfUsage(f.type);
if (internalName.length == 1) {
return internalName;
}
return 'L$internalName;';
}
4 changes: 4 additions & 0 deletions jnigen/test/bindings_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ void main() async {
expect(Example.addInts(10, 15), equals(25));
});

test('static methods arrays', () {
expect(Example.addAll(Example.getArr()), 6);
});

test('instance methods', () {
final ex = Example();
expect(ex.getNum(), equals(Example.num));
Expand Down
34 changes: 16 additions & 18 deletions jnigen/test/jackson_core_test/third_party/src/jackson_core_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -951,7 +951,7 @@ JniResult JsonFactory__createParser4(jobject self_, jobject data) {
if (_c_JsonFactory == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonFactory, &_m_JsonFactory__createParser4, "createParser",
"(L[B;)Lcom/fasterxml/jackson/core/JsonParser;");
"([B)Lcom/fasterxml/jackson/core/JsonParser;");
if (_m_JsonFactory__createParser4 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand All @@ -971,7 +971,7 @@ JniResult JsonFactory__createParser5(jobject self_,
if (_c_JsonFactory == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonFactory, &_m_JsonFactory__createParser5, "createParser",
"(L[B;II)Lcom/fasterxml/jackson/core/JsonParser;");
"([BII)Lcom/fasterxml/jackson/core/JsonParser;");
if (_m_JsonFactory__createParser5 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand Down Expand Up @@ -1005,7 +1005,7 @@ JniResult JsonFactory__createParser7(jobject self_, jobject content) {
if (_c_JsonFactory == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonFactory, &_m_JsonFactory__createParser7, "createParser",
"(L[C;)Lcom/fasterxml/jackson/core/JsonParser;");
"([C)Lcom/fasterxml/jackson/core/JsonParser;");
if (_m_JsonFactory__createParser7 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand All @@ -1025,7 +1025,7 @@ JniResult JsonFactory__createParser8(jobject self_,
if (_c_JsonFactory == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonFactory, &_m_JsonFactory__createParser8, "createParser",
"(L[C;II)Lcom/fasterxml/jackson/core/JsonParser;");
"([CII)Lcom/fasterxml/jackson/core/JsonParser;");
if (_m_JsonFactory__createParser8 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand Down Expand Up @@ -1265,7 +1265,7 @@ JniResult JsonFactory__createJsonParser4(jobject self_, jobject data) {
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonFactory, &_m_JsonFactory__createJsonParser4,
"createJsonParser",
"(L[B;)Lcom/fasterxml/jackson/core/JsonParser;");
"([B)Lcom/fasterxml/jackson/core/JsonParser;");
if (_m_JsonFactory__createJsonParser4 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand All @@ -1286,7 +1286,7 @@ JniResult JsonFactory__createJsonParser5(jobject self_,
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonFactory, &_m_JsonFactory__createJsonParser5,
"createJsonParser",
"(L[B;II)Lcom/fasterxml/jackson/core/JsonParser;");
"([BII)Lcom/fasterxml/jackson/core/JsonParser;");
if (_m_JsonFactory__createJsonParser5 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand Down Expand Up @@ -1445,7 +1445,7 @@ JniResult JsonFactory_Feature__values() {
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_JsonFactory_Feature, &_m_JsonFactory_Feature__values,
"values",
"()L[com/fasterxml/jackson/core/JsonFactory$Feature;");
"()[Lcom/fasterxml/jackson/core/JsonFactory$Feature;");
if (_m_JsonFactory_Feature__values == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(
Expand Down Expand Up @@ -1672,7 +1672,7 @@ JniResult JsonParser__setRequestPayloadOnError1(jobject self_,
if (_c_JsonParser == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonParser, &_m_JsonParser__setRequestPayloadOnError1,
"setRequestPayloadOnError", "(L[B;Ljava/lang/String;)V");
"setRequestPayloadOnError", "([BLjava/lang/String;)V");
if (_m_JsonParser__setRequestPayloadOnError1 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
(*jniEnv)->CallVoidMethod(jniEnv, self_,
Expand Down Expand Up @@ -2685,7 +2685,7 @@ JniResult JsonParser__getTextCharacters(jobject self_) {
if (_c_JsonParser == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonParser, &_m_JsonParser__getTextCharacters,
"getTextCharacters", "()L[C;");
"getTextCharacters", "()[C");
if (_m_JsonParser__getTextCharacters == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand Down Expand Up @@ -2963,7 +2963,7 @@ JniResult JsonParser__getBinaryValue(jobject self_, jobject bv) {
if (_c_JsonParser == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonParser, &_m_JsonParser__getBinaryValue, "getBinaryValue",
"(Lcom/fasterxml/jackson/core/Base64Variant;)L[B;");
"(Lcom/fasterxml/jackson/core/Base64Variant;)[B");
if (_m_JsonParser__getBinaryValue == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(
Expand All @@ -2980,7 +2980,7 @@ JniResult JsonParser__getBinaryValue1(jobject self_) {
if (_c_JsonParser == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonParser, &_m_JsonParser__getBinaryValue1, "getBinaryValue",
"()L[B;");
"()[B");
if (_m_JsonParser__getBinaryValue1 == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallObjectMethod(jniEnv, self_,
Expand Down Expand Up @@ -3365,7 +3365,7 @@ JniResult JsonParser_Feature__values() {
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_JsonParser_Feature, &_m_JsonParser_Feature__values,
"values",
"()L[com/fasterxml/jackson/core/JsonParser$Feature;");
"()[Lcom/fasterxml/jackson/core/JsonParser$Feature;");
if (_m_JsonParser_Feature__values == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(
Expand Down Expand Up @@ -3493,7 +3493,7 @@ JniResult JsonParser_NumberType__values() {
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_JsonParser_NumberType,
&_m_JsonParser_NumberType__values, "values",
"()L[com/fasterxml/jackson/core/JsonParser$NumberType;");
"()[Lcom/fasterxml/jackson/core/JsonParser$NumberType;");
if (_m_JsonParser_NumberType__values == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(
Expand Down Expand Up @@ -3551,7 +3551,7 @@ JniResult JsonToken__values() {
if (_c_JsonToken == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_static_method(_c_JsonToken, &_m_JsonToken__values, "values",
"()L[com/fasterxml/jackson/core/JsonToken;");
"()[Lcom/fasterxml/jackson/core/JsonToken;");
if (_m_JsonToken__values == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result = (*jniEnv)->CallStaticObjectMethod(jniEnv, _c_JsonToken,
Expand Down Expand Up @@ -3633,8 +3633,7 @@ JniResult JsonToken__asCharArray(jobject self_) {
load_class_gr(&_c_JsonToken, "com/fasterxml/jackson/core/JsonToken");
if (_c_JsonToken == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonToken, &_m_JsonToken__asCharArray, "asCharArray",
"()L[C;");
load_method(_c_JsonToken, &_m_JsonToken__asCharArray, "asCharArray", "()[C");
if (_m_JsonToken__asCharArray == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result =
Expand All @@ -3650,8 +3649,7 @@ JniResult JsonToken__asByteArray(jobject self_) {
load_class_gr(&_c_JsonToken, "com/fasterxml/jackson/core/JsonToken");
if (_c_JsonToken == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
load_method(_c_JsonToken, &_m_JsonToken__asByteArray, "asByteArray",
"()L[B;");
load_method(_c_JsonToken, &_m_JsonToken__asByteArray, "asByteArray", "()[B");
if (_m_JsonToken__asByteArray == NULL)
return (JniResult){.result = {.j = 0}, .exception = check_exception()};
jobject _result =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

package com.github.dart_lang.jnigen.simple_package;

import java.util.Arrays;

public class Example {
public static final int ON = 1;
public static final int OFF = 0;
Expand All @@ -28,6 +30,14 @@ public static int addInts(int a, int b) {
return a + b;
}

public static Integer[] getArr() {
return new Integer[] {1, 2, 3};
}

public static int addAll(Integer[] arr) {
return Arrays.stream(arr).mapToInt(val -> val).sum();
}

public Example getSelf() {
return this;
}
Expand Down
16 changes: 16 additions & 0 deletions jnigen/test/simple_package_test/lib/simple_package.dart
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,22 @@ class Example extends jni.JniObject {
/// from: static public int addInts(int a, int b)
static int addInts(int a, int b) => _addInts(a, b).integer;

static final _getArr =
jniLookup<ffi.NativeFunction<jni.JniResult Function()>>("Example__getArr")
.asFunction<jni.JniResult Function()>();

/// from: static public java.lang.Integer[] getArr()
/// The returned object must be deleted after use, by calling the `delete` method.
static jni.JniObject getArr() => jni.JniObject.fromRef(_getArr().object);

static final _addAll = jniLookup<
ffi.NativeFunction<
jni.JniResult Function(ffi.Pointer<ffi.Void>)>>("Example__addAll")
.asFunction<jni.JniResult Function(ffi.Pointer<ffi.Void>)>();

/// from: static public int addAll(java.lang.Integer[] arr)
static int addAll(jni.JniObject arr) => _addAll(arr.reference).integer;

static final _getSelf = jniLookup<
ffi.NativeFunction<
jni.JniResult Function(
Expand Down
Loading