Skip to content

Commit 01443b8

Browse files
Merge pull request #46 from dart-native/android_gen
Android gen
2 parents 933b333 + 5e6b1c4 commit 01443b8

File tree

4 files changed

+141
-89
lines changed

4 files changed

+141
-89
lines changed

lib/java/DNJavaContext.js

Lines changed: 37 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import DNJavaTypeConverter from './DNJavaTypeConverter.js'
2+
3+
let JC = new DNJavaTypeConverter
14
export class DNContext {
25
constructor(internal) {
36
this.internal = internal
@@ -16,33 +19,6 @@ export class DNContext {
1619
}
1720

1821
var packageName = ''
19-
var basic_type_signature = new Map([
20-
['char', 'C'],
21-
['int', 'I'],
22-
['double', 'D'],
23-
['float', 'F'],
24-
['byte', 'B'],
25-
['short', 'S'],
26-
['long', 'J'],
27-
['boolean', 'Z'],
28-
['void', 'V']
29-
])
30-
31-
var basic_type_conversion = function (type) {
32-
if(type === 'float') return 'double'
33-
34-
var intArray = ['short', 'byte', 'long']
35-
if(intArray.includes(type)) return 'int'
36-
37-
if(type === 'boolean') return 'bool'
38-
39-
if(type === 'char') return 'String'
40-
41-
return type;
42-
}
43-
44-
var basic_type_wrapper = ['byte', 'short', 'long', 'long', 'float', 'char']
45-
4622
export class DNArgumentContext extends DNContext {
4723
constructor(internal, name, type) {
4824
super(internal)
@@ -61,67 +37,48 @@ export class DNMethodContext extends DNContext {
6137
}
6238

6339
parse() {
64-
var result = '\n ' + this.methodReturnType() + ' ' + this.methodName + '(' + this.methodArgs() + ')' + ' {\n'
40+
var type = ''
41+
if (this.returnType == 'char') {
42+
type = 'int'
43+
} else {
44+
type = DNJavaTypeConverter.DNJava2DartBasicTypeMap[this.returnType]
45+
}
46+
var nullCheck = DNJavaTypeConverter.javaBasicType.includes(this.returnType) ? '' : '?'
47+
var result = '\n ' + (type == null ? this.returnType : type) + nullCheck + ' ' + this.methodName + '(' + this.methodArgs() + ')' + ' {\n'
6548
result += ' ' + this.methodImpl()
6649
result += ' }'
6750
return result
6851
}
6952

70-
methodReturnType() {
71-
return basic_type_conversion(this.returnType);
72-
}
73-
7453
methodImpl() {
75-
// this.basicTypeWrapper()
76-
var callerPrefix = ' invoke(\'' + this.methodName + '\', '
77-
var args = '[' + this.basicTypeWrapper() + '], '
78-
var returnType = '\'' + this.JNIReturnType() + '\''
79-
return 'return' + callerPrefix + args + returnType + ');\n'
54+
var callerPrefix = JC.convertToDartInvoke(this.returnType) + '(\'' + this.methodName + '\''
55+
var args = ''
56+
if (this.args.length > 0) {
57+
args = ', ' + 'args: [' + this.basicTypeWrapper() + ']'
58+
}
59+
return 'return ' + callerPrefix + args + ');\n'
8060
}
8161

8262
basicTypeWrapper() {
8363
var types = this.args.map(arg => arg.type)
8464
var argNames = this.args.map(arg => arg.name)
8565
var wrapperArgs = ''
8666
for(var i = 0; i < argNames.length; i++) {
87-
if(i != 0) {
67+
wrapperArgs += JC.convertToDartArgument(types[i], argNames[i]);
68+
if(i != argNames.length - 1) {
8869
wrapperArgs += ','
8970
}
90-
91-
if(basic_type_wrapper.includes(types[i])) {
92-
if(types[i] == 'char') {
93-
wrapperArgs += 'jchar(' + argNames[i] + '.codeUnitAt(0))'
94-
continue
95-
}
96-
97-
wrapperArgs += types[i] + '(' + argNames[i] + ')'
98-
continue
99-
}
100-
101-
wrapperArgs += argNames[i]
10271
}
10372
return wrapperArgs
10473
}
10574

106-
JNIReturnType() {
107-
var result = basic_type_signature.get(this.returnType)
108-
if (result == undefined) {
109-
//todo class jni signature
110-
if(this.returnType == 'String') {
111-
result = 'Ljava/lang/String;'
112-
}
113-
}
114-
return result
115-
}
116-
11775
methodArgs() {
11876
var argList = ''
11977
this.args.forEach((element, index) => {
120-
var argType = basic_type_conversion(element.type)
121-
if(index == this.args.length - 1){
122-
argList += argType + ' ' + element.name
123-
}else{
124-
argList += argType + ' ' + element.name + ', '
78+
var argType = DNJavaTypeConverter.DNJava2DartBasicTypeMap[element.type]
79+
argList += (argType == null ? element.type : argType) + ' ' + element.name
80+
if(index != this.args.length - 1){
81+
argList += ','
12582
}
12683
})
12784
return argList
@@ -140,12 +97,15 @@ export class DNClassContext extends DNContext {
14097
}
14198

14299
parse() {
143-
var result = 'class ' + this.name + ' extends JObject'
100+
var result = '@native(javaClass: \'' + packageName + this.name + '\')\n'
101+
result += 'class ' + this.name + ' extends JObject'
144102
result += ' {\n'
145-
result += this.name + '([Pointer? ptr]) : super(\"' + packageName + this.name + '\", ' + 'pointer: ptr' + ');\n'
146103
if (this.args.length != 0) {
147-
result += this.name + '(' + this.methodArgs() + ') : super(\"' + packageName + this.name + '\", [' + this.basicTypeWrapper() + ']);\n'
148-
}
104+
result += this.name + '.withParameters(' + this.methodArgs() + ') : super(args: [' + this.basicTypeWrapper() + ']);\n'
105+
} else {
106+
result += this.name + '() : super();\n'
107+
}
108+
result += this.name + '.fromPointer(Pointer<Void> pointer) : super.fromPointer(pointer);\n'
149109
this.methods.forEach(element => {
150110
var parseRet = element.parse()
151111
result += parseRet ? parseRet + '\n' : ''
@@ -157,11 +117,10 @@ export class DNClassContext extends DNContext {
157117
methodArgs() {
158118
var argList = ''
159119
this.args.forEach((element, index) => {
160-
var argType = basic_type_conversion(element.type)
161-
if(index == this.args.length - 1){
162-
argList += argType + ' ' + element.name
163-
}else{
164-
argList += argType + ' ' + element.name + ', '
120+
var argType = DNJavaTypeConverter.DNJava2DartBasicTypeMap[element.type]
121+
argList += (argType == null ? element.type : argType) + ' ' + element.name
122+
if(index != this.args.length - 1){
123+
argList += ','
165124
}
166125
})
167126
return argList
@@ -172,21 +131,10 @@ export class DNClassContext extends DNContext {
172131
var argNames = this.args.map(arg => arg.name)
173132
var wrapperArgs = ''
174133
for(var i = 0; i < argNames.length; i++) {
175-
if(i != 0) {
134+
wrapperArgs += JC.convertToDartArgument(types[i], argNames[i]);
135+
if(i != argNames.length - 1) {
176136
wrapperArgs += ','
177137
}
178-
179-
if(basic_type_wrapper.includes(types[i])) {
180-
if(types[i] == 'char') {
181-
wrapperArgs += 'jchar(' + argNames[i] + '.codeUnitAt(0))'
182-
continue
183-
}
184-
185-
wrapperArgs += types[i] + '(' + argNames[i] + ')'
186-
continue
187-
}
188-
189-
wrapperArgs += argNames[i]
190138
}
191139
return wrapperArgs
192140
}
@@ -250,6 +198,7 @@ export class DNRootContext extends DNContext {
250198
var result = ""
251199
var packageSet = new Set()
252200
result += '// Generated by @dartnative/codegen:\n// https://www.npmjs.com/package/@dartnative/codegen\n\n'
201+
result += "import 'dart:ffi';\n"
253202
result += "import 'package:dart_native/dart_native.dart';\n"
254203
result += "import 'package:dart_native_gen/dart_native_gen.dart';\n"
255204
result += this.children.map(ctx => ctx.parse()).join('\n\n')

lib/java/DNJavaTypeConverter.js

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
export default class DNJavaTypeConverter {
2+
DNJavaTypeConverter() {
3+
if (!DNJavaTypeConverter.instance) {
4+
DNJavaTypeConverter.instance = this
5+
}
6+
return DNJavaTypeConverter.instance
7+
}
8+
9+
convertToDartArgument(javaType, argName) {
10+
if (javaType == 'char') {
11+
return 'jchar(' + argName + '.codeUnitAt(0))'
12+
}
13+
if (javaType == 'int' || javaType == 'double' || javaType == 'boolean') {
14+
return argName;
15+
}
16+
17+
var wrapperType = DNJavaTypeConverter.DNJava2DartWrapperTypeMap[javaType]
18+
if (wrapperType != null) {
19+
return wrapperType + '(' + argName + ')'
20+
}
21+
22+
return argName
23+
}
24+
25+
convertToDartInvoke(returnType) {
26+
var invokeType = DNJavaTypeConverter.DNDartInvokeMap[returnType]
27+
if (invokeType != null) {
28+
return 'invoke' + invokeType
29+
}
30+
31+
return 'invokeObject<' + returnType + '>';
32+
}
33+
}
34+
35+
DNJavaTypeConverter.DNJava2DartBasicTypeMap = {
36+
// java type | dart type
37+
'byte' : 'int',
38+
'short' : 'int',
39+
'char' : 'String',
40+
'int' : 'int',
41+
'long' : 'int',
42+
'float' : 'double',
43+
'double' : 'double',
44+
'boolean' : 'bool',
45+
'Set' : 'Set',
46+
'HashSet' : 'Set',
47+
'Map' : 'Map',
48+
'HashMap' : 'Map',
49+
'List' : 'List',
50+
'ArrayList' : 'List',
51+
}
52+
53+
54+
DNJavaTypeConverter.DNJava2DartWrapperTypeMap = {
55+
// java type | dart wrapper type
56+
'byte' : 'byte',
57+
'int' : 'int',
58+
'short' : 'short',
59+
'char' : 'jchar',
60+
'float' : 'float',
61+
'long' : 'long',
62+
'double' : 'double',
63+
'boolean' : 'boolean',
64+
'Set' : 'JSet',
65+
'HashSet' : 'JHashSet',
66+
'Map' : 'JMap',
67+
'HashMap' : 'JHashMap',
68+
'List' : 'JList',
69+
'ArrayList' : 'JArrayList',
70+
'Boolean' : 'JBoolean',
71+
'Byte' : 'JByte',
72+
'Character' : 'JCharacter',
73+
'Double' : 'JDouble',
74+
'Float' : 'JFloat',
75+
'Integer' : 'JInteger',
76+
'Long' : 'JLong',
77+
'Short' : 'JShort',
78+
}
79+
80+
DNJavaTypeConverter.DNDartInvokeMap = {
81+
// java type | dart invoke type
82+
'int' : 'Int',
83+
'byte' : 'Byte',
84+
'short' : 'Short',
85+
'long' : 'Long',
86+
'char' : 'Char',
87+
'boolean' : 'Bool',
88+
'void' : 'Void',
89+
'String' : 'String',
90+
'float' : 'Float',
91+
'double' : 'Double',
92+
'Set' : 'Set',
93+
'HashSet' : 'HashSet',
94+
'Map' : 'Map',
95+
'HashMap' : 'HashMap',
96+
'List' : 'List',
97+
'ArrayList' : 'ArrayList',
98+
}
99+
100+
DNJavaTypeConverter.javaBasicType = ['int', 'byte', 'short', 'long', 'char', 'boolean', 'float', 'double', 'void']

lib/objc/DNObjectiveCContext.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ export class DNClassContext extends DNContext {
476476
parse() {
477477
this.preMarkConstructMethods()
478478
var result = this.availability.map((a) => a.parse()).join(' ') + '\n'
479-
result += '@native\nclass ' + this.name
479+
result += '@native()\nclass ' + this.name
480480
if (this.superClass) {
481481
result += ' extends ' + this.superClass
482482
}

test/java/helloworld.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,7 @@ public String getString(String s) {
4848
return "test success";
4949
}
5050

51+
public HashSet<String> getHash(HashSet<String> bts) {
52+
return new HashSet<String>();
53+
}
5154
}

0 commit comments

Comments
 (0)