Skip to content

Commit 1784be0

Browse files
hui19huizzzhou
authored andcommitted
feat: support new interface
1 parent 933b333 commit 1784be0

File tree

3 files changed

+104
-65
lines changed

3 files changed

+104
-65
lines changed

lib/java/DNJavaContext.js

Lines changed: 31 additions & 64 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
@@ -28,16 +31,15 @@ var basic_type_signature = new Map([
2831
['void', 'V']
2932
])
3033

34+
var intArray = ['short', 'byte', 'long']
35+
3136
var basic_type_conversion = function (type) {
3237
if(type === 'float') return 'double'
33-
34-
var intArray = ['short', 'byte', 'long']
38+
3539
if(intArray.includes(type)) return 'int'
3640

3741
if(type === 'boolean') return 'bool'
3842

39-
if(type === 'char') return 'String'
40-
4143
return type;
4244
}
4345

@@ -61,67 +63,40 @@ export class DNMethodContext extends DNContext {
6163
}
6264

6365
parse() {
64-
var result = '\n ' + this.methodReturnType() + ' ' + this.methodName + '(' + this.methodArgs() + ')' + ' {\n'
66+
var type = DNJavaTypeConverter.DNJava2DartBasicTypeMap[this.returnType]
67+
var result = '\n ' + (type == null ? this.returnType : type) + ' ' + this.methodName + '(' + this.methodArgs() + ')' + ' {\n'
6568
result += ' ' + this.methodImpl()
6669
result += ' }'
6770
return result
6871
}
6972

70-
methodReturnType() {
71-
return basic_type_conversion(this.returnType);
72-
}
73-
7473
methodImpl() {
7574
// 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'
75+
var callerPrefix = JC.convertToDartInvoke(this.returnType) + '(\'' + this.methodName + '\', '
76+
var args = 'args: [' + this.basicTypeWrapper() + '] '
77+
return 'return ' + callerPrefix + args + ');\n'
8078
}
8179

8280
basicTypeWrapper() {
8381
var types = this.args.map(arg => arg.type)
8482
var argNames = this.args.map(arg => arg.name)
8583
var wrapperArgs = ''
8684
for(var i = 0; i < argNames.length; i++) {
87-
if(i != 0) {
85+
wrapperArgs += JC.convertToDartArgument(types[i], argNames[i]);
86+
if(i != argNames.length - 1) {
8887
wrapperArgs += ','
8988
}
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]
10289
}
10390
return wrapperArgs
10491
}
10592

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-
11793
methodArgs() {
11894
var argList = ''
11995
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 + ', '
96+
var argType = DNJavaTypeConverter.DNJava2DartBasicTypeMap[element.type]
97+
argList += (argType == null ? element.type : argType) + ' ' + element.name
98+
if(index != this.args.length - 1){
99+
argList += ','
125100
}
126101
})
127102
return argList
@@ -140,12 +115,15 @@ export class DNClassContext extends DNContext {
140115
}
141116

142117
parse() {
143-
var result = 'class ' + this.name + ' extends JObject'
118+
var result = '@native(javaClass: \'' + packageName + this.name + '\')\n'
119+
result += 'class ' + this.name + ' extends JObject'
144120
result += ' {\n'
145-
result += this.name + '([Pointer? ptr]) : super(\"' + packageName + this.name + '\", ' + 'pointer: ptr' + ');\n'
146121
if (this.args.length != 0) {
147-
result += this.name + '(' + this.methodArgs() + ') : super(\"' + packageName + this.name + '\", [' + this.basicTypeWrapper() + ']);\n'
148-
}
122+
result += this.name + '.withParameters(' + this.methodArgs() + ') : super(args: [' + this.basicTypeWrapper() + ']);\n'
123+
} else {
124+
result += this.name + '() : super();\n'
125+
}
126+
result += this.name + '.fromPointer(Pointer<Void> pointer) : super.fromPointer(pointer);\n'
149127
this.methods.forEach(element => {
150128
var parseRet = element.parse()
151129
result += parseRet ? parseRet + '\n' : ''
@@ -157,11 +135,10 @@ export class DNClassContext extends DNContext {
157135
methodArgs() {
158136
var argList = ''
159137
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 + ', '
138+
var argType = DNJavaTypeConverter.DNJava2DartBasicTypeMap[element.type]
139+
argList += (argType == null ? element.type : argType) + ' ' + element.name
140+
if(index != this.args.length - 1){
141+
argList += ','
165142
}
166143
})
167144
return argList
@@ -172,21 +149,10 @@ export class DNClassContext extends DNContext {
172149
var argNames = this.args.map(arg => arg.name)
173150
var wrapperArgs = ''
174151
for(var i = 0; i < argNames.length; i++) {
175-
if(i != 0) {
152+
wrapperArgs += JC.convertToDartArgument(types[i], argNames[i]);
153+
if(i != argNames.length - 1) {
176154
wrapperArgs += ','
177155
}
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]
190156
}
191157
return wrapperArgs
192158
}
@@ -250,6 +216,7 @@ export class DNRootContext extends DNContext {
250216
var result = ""
251217
var packageSet = new Set()
252218
result += '// Generated by @dartnative/codegen:\n// https://www.npmjs.com/package/@dartnative/codegen\n\n'
219+
result += "import 'dart:ffi';\n"
253220
result += "import 'package:dart_native/dart_native.dart';\n"
254221
result += "import 'package:dart_native_gen/dart_native_gen.dart';\n"
255222
result += this.children.map(ctx => ctx.parse()).join('\n\n')

lib/java/DNJavaTypeConverter.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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+
}
46+
47+
48+
DNJavaTypeConverter.DNJava2DartWrapperTypeMap = {
49+
// java type | dart wrapper type
50+
'byte' : 'byte',
51+
'int' : 'int',
52+
'short' : 'short',
53+
'char' : 'jchar',
54+
'float' : 'float',
55+
'long' : 'long',
56+
'double' : 'double',
57+
'boolean' : 'boolean',
58+
}
59+
60+
DNJavaTypeConverter.DNDartInvokeMap = {
61+
// java type | dart invoke type
62+
'int' : 'Int',
63+
'byte' : 'Byte',
64+
'short' : 'Short',
65+
'long' : 'Long',
66+
'char' : 'Char',
67+
'boolean' : 'Bool',
68+
'void' : 'Void',
69+
'String' : 'String',
70+
'float' : 'Float',
71+
'double' : 'Double',
72+
}

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
}

0 commit comments

Comments
 (0)