Skip to content

Commit 0ea736d

Browse files
committed
Improve support for Arrays of Strings in JNI Generator
A number of places in the GTK4 API there is the possibility of passing in arrays of Strings, i.e. Java String[] -> char ** as input argument to C side. This change adds better support to the JNI generator for this use case by converting the jobjectArray (String[]) to char ** on the C side. Part of #2126 Split out of #2538
1 parent cbf7f7a commit 0ea736d

File tree

7 files changed

+82
-4
lines changed

7 files changed

+82
-4
lines changed

bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ASTType.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,10 @@ public String getTypeSignature2() {
148148
if (name.equals("Ljava/lang/String;")) return "jstring";
149149
if (name.equals("Ljava/lang/Class;")) return "jclass";
150150
if (isArray()) {
151-
return getComponentType().getTypeSignature2() + "Array";
151+
if (getComponentType().isPrimitive()) {
152+
return getComponentType().getTypeSignature2() + "Array";
153+
}
154+
return "jobjectArray";
152155
}
153156
return "jobject";
154157
}

bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,14 @@ boolean generateGetParameter(JNIParameter param, boolean critical, int indent) {
299299
output(iStr);
300300
output(", NULL)");
301301
}
302+
} else if (componentType.isType("java.lang.String")) {
303+
if (param.getFlag(FLAG_UNICODE)) {
304+
throw new Error("not done");
305+
}
306+
307+
output("swt_getArrayOfStringsUTF(env, arg");
308+
output(iStr);
309+
output(")");
302310
} else {
303311
throw new Error("not done");
304312
}
@@ -381,6 +389,16 @@ void generateSetParameter(JNIParameter param, boolean critical) {
381389
output("0");
382390
}
383391
output(");");
392+
} else if (componentType.isType("java.lang.String")) {
393+
if (param.getFlag(FLAG_UNICODE)) {
394+
throw new Error("not done");
395+
}
396+
397+
output("swt_releaseArrayOfStringsUTF(env, arg");
398+
output(iStr);
399+
output(", lparg");
400+
output(iStr);
401+
output(");");
384402
} else {
385403
throw new Error("not done");
386404
}
@@ -452,6 +470,12 @@ boolean generateLocalVars(JNIParameter[] params, JNIType returnType) {
452470
output(componentType.getTypeSignature2());
453471
output(" *lparg" + i);
454472
output("=NULL;");
473+
} else if (componentType.isType("java.lang.String")) {
474+
if (param.getFlag(FLAG_UNICODE)) {
475+
output("jchar **lparg" + i + "=NULL");
476+
} else {
477+
output("char **lparg" + i+ "=NULL");
478+
}
455479
} else {
456480
throw new Error("not done");
457481
}

bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/ReflectType.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@ public String getTypeSignature2() {
9191
if (clazz == String.class) return "jstring";
9292
if (clazz == Class.class) return "jclass";
9393
if (clazz.isArray()) {
94-
return getComponentType().getTypeSignature2() + "Array";
94+
if (getComponentType().isPrimitive()) {
95+
return getComponentType().getTypeSignature2() + "Array";
96+
}
97+
return "jobjectArray";
9598
}
9699
return "jobject";
97100
}

bundles/org.eclipse.swt.tools/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
22
Bundle-Name: %pluginName
33
Bundle-Vendor: %providerName
44
Bundle-SymbolicName: org.eclipse.swt.tools; singleton:=true
5-
Bundle-Version: 3.110.800.qualifier
5+
Bundle-Version: 3.110.900.qualifier
66
Bundle-ManifestVersion: 2
77
Export-Package: org.eclipse.swt.tools.internal; x-internal:=true
88
Bundle-ActivationPolicy: lazy

bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2187,3 +2187,48 @@ void swt_debug_on_fatal_warnings() {
21872187
gtk_parse_args(&argcount, &arg2);
21882188
}
21892189
#endif
2190+
2191+
/**
2192+
* Convert an array of Java strings to an array of char *
2193+
*/
2194+
char **
2195+
swt_getArrayOfStringsUTF(JNIEnv *env, jobjectArray javaArray) {
2196+
jsize length = (*env)->GetArrayLength(env, javaArray);
2197+
2198+
char **cStrings = (char **)malloc((length + 1) * sizeof(char*));
2199+
if (!cStrings) {
2200+
return NULL;
2201+
}
2202+
2203+
for (jsize i = 0; i < length; i++) {
2204+
jstring jstr = (jstring)(*env)->GetObjectArrayElement(env, javaArray, i);
2205+
if (jstr) {
2206+
const char *utfStr = (*env)->GetStringUTFChars(env, jstr, 0);
2207+
2208+
cStrings[i] = strdup(utfStr);
2209+
2210+
(*env)->ReleaseStringUTFChars(env, jstr, utfStr);
2211+
(*env)->DeleteLocalRef(env, jstr);
2212+
} else {
2213+
cStrings[i] = NULL;
2214+
}
2215+
}
2216+
2217+
cStrings[length] = NULL;
2218+
return cStrings;
2219+
}
2220+
2221+
/**
2222+
* Free the memory allocated by swt_getArrayOfStringsUTF
2223+
*/
2224+
void
2225+
swt_releaseArrayOfStringsUTF(JNIEnv *env, jobjectArray javaArray, char **cStrings) {
2226+
jsize length = (*env)->GetArrayLength(env, javaArray);
2227+
2228+
for (jsize i = 0; i < length; i++) {
2229+
if (cStrings[i]) {
2230+
free(cStrings[i]);
2231+
}
2232+
}
2233+
free(cStrings);
2234+
}

bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,7 @@ jlong call_accessible_object_function (const char *method_name, const char *meth
187187
void swt_set_lock_functions();
188188
void swt_debug_on_fatal_warnings() ;
189189

190+
char **swt_getArrayOfStringsUTF(JNIEnv *env, jobjectArray javaArray);
191+
void swt_releaseArrayOfStringsUTF(JNIEnv *env, jobjectArray javaArray, char **cStrings);
192+
190193
#endif /* ORG_ECLIPSE_SWT_GTK_OS_CUSTOM_H (include guard, this should be the last line) */

features/org.eclipse.swt.tools.feature/feature.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.eclipse.swt.tools.feature"
44
label="%featureName"
5-
version="3.109.800.qualifier"
5+
version="3.109.900.qualifier"
66
provider-name="%providerName"
77
license-feature="org.eclipse.license"
88
license-feature-version="0.0.0">

0 commit comments

Comments
 (0)