Skip to content

Commit 8821441

Browse files
pkspyder007viferga
andauthored
Java tests (#367)
* adds cstdlib header in node port * updated Contributors.md * fix include * add java from github actions * fix yaml syntax * fix typo in win-test * fix dynamic array creation in java loader impl * setup java from script * remove java install from github action * fix clang formatting * fix clang formatting * fix remaining clang-format issues * fix java_loader_imp.cpp content duplication * free mallocs in java_loader Co-authored-by: Vicente Eduardo Ferrer Garcia <[email protected]>
1 parent 6cdaac9 commit 8821441

File tree

3 files changed

+65
-23
lines changed

3 files changed

+65
-23
lines changed

.github/workflows/windows-test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
- name: Set up the environment
3939
run: cmd.exe /c "powershell .\tools\metacall-environment.ps1 $Env:METACALL_INSTALL_OPTIONS"
4040
env:
41-
METACALL_INSTALL_OPTIONS: python nodejs # ruby netcore5 typescript file rpc wasm java c cobol rust rapidjson funchook swig pack # clangformat v8rep51 coverage
41+
METACALL_INSTALL_OPTIONS: python nodejs java # ruby netcore5 typescript file rpc wasm java c cobol rust rapidjson funchook swig pack # clangformat v8rep51 coverage
4242

4343
- name: Configure
4444
run: |
@@ -47,7 +47,7 @@ jobs:
4747
cd "$METACALL_PATH\build"
4848
cmd.exe /c "powershell ..\tools\metacall-configure.ps1 $Env:METACALL_BUILD_OPTIONS"
4949
env:
50-
METACALL_BUILD_OPTIONS: ${{ matrix.buildtype }} scripts ports tests python nodejs sanitizer # ruby netcore5 typescript file rpc wasm java c cobol rust examples dynamic install pack benchmarks # v8 coverage
50+
METACALL_BUILD_OPTIONS: ${{ matrix.buildtype }} scripts ports tests python nodejs java sanitizer # ruby # netcore5 typescript file rpc wasm java c cobol rust examples dynamic install pack benchmarks # v8 coverage
5151

5252
- name: Build
5353
working-directory: ./build

source/loaders/java_loader/source/java_loader_impl.cpp

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -293,79 +293,89 @@ void getJValArray(jvalue *constructorArgs, class_args args, size_t argc, JNIEnv
293293
case TYPE_BOOL: {
294294
jbooleanArray setArr = env->NewBooleanArray((jsize)array_size);
295295

296-
jboolean fill[array_size];
296+
jboolean *fill = (jboolean *)malloc(array_size * sizeof(jboolean));
297297
for (size_t i = 0; i < array_size; i++)
298298
fill[i] = (jboolean)value_to_bool(array_value[i]);
299299

300300
env->SetBooleanArrayRegion(setArr, 0, array_size, fill);
301301
constructorArgs[i].l = setArr;
302+
free(fill);
302303
break;
303304
}
304305
case TYPE_CHAR: {
305306
jcharArray setArr = env->NewCharArray((jsize)array_size);
306307

307-
jchar fill[array_size];
308+
jchar *fill = (jchar *)malloc(array_size * sizeof(jchar));
308309
for (size_t i = 0; i < array_size; i++)
309310
fill[i] = (jchar)value_to_char(array_value[i]);
310311

311312
env->SetCharArrayRegion(setArr, 0, array_size, fill);
312313
constructorArgs[i].l = setArr;
314+
free(fill);
313315
break;
314316
}
315317
case TYPE_SHORT: {
316318
jshortArray setArr = env->NewShortArray((jsize)array_size);
317319

318-
jshort fill[array_size];
320+
jshort *fill = (jshort *)malloc(array_size * sizeof(jshort));
319321
for (size_t i = 0; i < array_size; i++)
320322
fill[i] = (jshort)value_to_short(array_value[i]);
321323

322324
env->SetShortArrayRegion(setArr, 0, array_size, fill);
323325
constructorArgs[i].l = setArr;
326+
free(fill);
324327
break;
325328
}
326329

327330
case TYPE_INT: {
328331
jintArray setArr = env->NewIntArray((jsize)array_size);
329332

330-
jint fill[array_size];
333+
jint *fill = (jint *)malloc(array_size * sizeof(jint));
334+
331335
for (size_t i = 0; i < array_size; i++)
332336
fill[i] = (jint)value_to_int(array_value[i]);
333337

334338
env->SetIntArrayRegion(setArr, 0, array_size, fill);
335339
constructorArgs[i].l = setArr;
340+
free(fill);
336341
break;
337342
}
338343
case TYPE_LONG: {
339344
jlongArray setArr = env->NewLongArray((jsize)array_size);
340345

341-
jlong fill[array_size];
346+
jlong *fill = (jlong *)malloc(array_size * sizeof(jlong));
347+
342348
for (size_t i = 0; i < array_size; i++)
343349
fill[i] = (jlong)value_to_long(array_value[i]);
344350

345351
env->SetLongArrayRegion(setArr, 0, array_size, fill);
346352
constructorArgs[i].l = setArr;
353+
free(fill);
347354
break;
348355
}
349356
case TYPE_FLOAT: {
350357
jfloatArray setArr = env->NewFloatArray((jsize)array_size);
351358

352-
jfloat fill[array_size];
359+
jfloat *fill = (jfloat *)malloc(array_size * sizeof(jfloat));
360+
353361
for (size_t i = 0; i < array_size; i++)
354362
fill[i] = (jfloat)value_to_float(array_value[i]);
355363

356364
env->SetFloatArrayRegion(setArr, 0, array_size, fill);
357365
constructorArgs[i].l = setArr;
366+
free(fill);
358367
break;
359368
}
360369
case TYPE_DOUBLE: {
361370
jdoubleArray setArr = env->NewDoubleArray((jsize)array_size);
362371

363-
jdouble fill[array_size];
372+
jdouble *fill = (jdouble *)malloc(array_size * sizeof(jdouble));
364373
for (size_t i = 0; i < array_size; i++)
365374
fill[i] = (jdouble)value_to_double(array_value[i]);
366375

367376
env->SetDoubleArrayRegion(setArr, 0, array_size, fill);
368377
constructorArgs[i].l = setArr;
378+
free(fill);
369379
break;
370380
}
371381

@@ -702,78 +712,86 @@ int java_object_interface_set(object obj, object_impl impl, struct accessor_type
702712
{
703713
jbooleanArray setArr = java_impl->env->NewBooleanArray((jsize)array_size);
704714

705-
jboolean fill[array_size];
715+
jboolean *fill = (jboolean *)malloc(array_size * sizeof(jboolean));
716+
706717
for (size_t i = 0; i < array_size; i++)
707718
fill[i] = (jboolean)value_to_bool(array_value[i]);
708719

709720
java_impl->env->SetBooleanArrayRegion(setArr, 0, array_size, fill);
710721
java_impl->env->SetObjectField(conObj, fID, setArr);
722+
free(fill);
711723
}
712724
else if (!strcmp(fType, "[C"))
713725
{
714726
jcharArray setArr = java_impl->env->NewCharArray((jsize)array_size);
715727

716-
jchar fill[array_size];
728+
jchar *fill = (jchar *)malloc(array_size * sizeof(jchar));
717729
for (size_t i = 0; i < array_size; i++)
718730
fill[i] = (jchar)value_to_char(array_value[i]);
719731

720732
java_impl->env->SetCharArrayRegion(setArr, 0, array_size, fill);
721733
java_impl->env->SetObjectField(conObj, fID, setArr);
734+
free(fill);
722735
}
723736
else if (!strcmp(fType, "[S"))
724737
{
725738
jshortArray setArr = java_impl->env->NewShortArray((jsize)array_size);
726739

727-
jshort fill[array_size];
740+
jshort *fill = (jshort *)malloc(array_size * sizeof(jshort));
728741
for (size_t i = 0; i < array_size; i++)
729742
fill[i] = (jshort)value_to_short(array_value[i]);
730743

731744
java_impl->env->SetShortArrayRegion(setArr, 0, array_size, fill);
732745
java_impl->env->SetObjectField(conObj, fID, setArr);
746+
free(fill);
733747
}
734748
else if (!strcmp(fType, "[I"))
735749
{
736750
jintArray setArr = java_impl->env->NewIntArray((jsize)array_size);
737751

738-
jint fill[array_size];
752+
jint *fill = (jint *)malloc(array_size * sizeof(jint));
739753
for (size_t i = 0; i < array_size; i++)
740754
fill[i] = (jint)value_to_int(array_value[i]);
741755

742756
java_impl->env->SetIntArrayRegion(setArr, 0, array_size, fill);
743757
java_impl->env->SetObjectField(conObj, fID, setArr);
758+
free(fill);
744759
}
745760
else if (!strcmp(fType, "[J"))
746761
{
747762
jlongArray setArr = java_impl->env->NewLongArray((jsize)array_size);
748763

749-
jlong fill[array_size];
764+
jlong *fill = (jlong *)malloc(array_size * sizeof(jlong));
750765
for (size_t i = 0; i < array_size; i++)
751766
fill[i] = (jlong)value_to_long(array_value[i]);
752767

753768
java_impl->env->SetLongArrayRegion(setArr, 0, array_size, fill);
754769
java_impl->env->SetObjectField(conObj, fID, setArr);
770+
free(fill);
755771
}
756772
else if (!strcmp(fType, "[F"))
757773
{
758774
jfloatArray setArr = java_impl->env->NewFloatArray((jsize)array_size);
759775

760-
jfloat fill[array_size];
776+
jfloat *fill = (jfloat *)malloc(array_size * sizeof(jfloat));
761777
for (size_t i = 0; i < array_size; i++)
762778
fill[i] = (jfloat)value_to_float(array_value[i]);
763779

764780
java_impl->env->SetFloatArrayRegion(setArr, 0, array_size, fill);
765781
java_impl->env->SetObjectField(conObj, fID, setArr);
782+
free(fill);
766783
}
767784
else if (!strcmp(fType, "[D"))
768785
{
769786
jdoubleArray setArr = java_impl->env->NewDoubleArray((jsize)array_size);
770787

771-
jdouble fill[array_size];
788+
jdouble *fill = (jdouble *)malloc(array_size * sizeof(jdouble));
772789
for (size_t i = 0; i < array_size; i++)
773790
fill[i] = (jdouble)value_to_double(array_value[i]);
774791

775792
java_impl->env->SetDoubleArrayRegion(setArr, 0, array_size, fill);
776793
java_impl->env->SetObjectField(conObj, fID, setArr);
794+
free(fill);
777795
}
778796
else if (!strcmp(fType, "[Ljava/lang/String;"))
779797
{
@@ -1331,78 +1349,85 @@ int java_class_interface_static_set(klass cls, class_impl impl, struct accessor_
13311349
{
13321350
jbooleanArray setArr = java_impl->env->NewBooleanArray((jsize)array_size);
13331351

1334-
jboolean fill[array_size];
1352+
jboolean *fill = (jboolean *)malloc(array_size * sizeof(jboolean));
13351353
for (size_t i = 0; i < array_size; i++)
13361354
fill[i] = (jboolean)value_to_bool(array_value[i]);
13371355

13381356
java_impl->env->SetBooleanArrayRegion(setArr, 0, array_size, fill);
13391357
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1358+
free(fill);
13401359
}
13411360
else if (!strcmp(fType, "[C"))
13421361
{
13431362
jcharArray setArr = java_impl->env->NewCharArray((jsize)array_size);
13441363

1345-
jchar fill[array_size];
1364+
jchar *fill = (jchar *)malloc(array_size * sizeof(jchar));
13461365
for (size_t i = 0; i < array_size; i++)
13471366
fill[i] = (jchar)value_to_char(array_value[i]);
13481367

13491368
java_impl->env->SetCharArrayRegion(setArr, 0, array_size, fill);
13501369
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1370+
free(fill);
13511371
}
13521372
else if (!strcmp(fType, "[S"))
13531373
{
13541374
jshortArray setArr = java_impl->env->NewShortArray((jsize)array_size);
13551375

1356-
jshort fill[array_size];
1376+
jshort *fill = (jshort *)malloc(array_size * sizeof(jshort));
13571377
for (size_t i = 0; i < array_size; i++)
13581378
fill[i] = (jshort)value_to_short(array_value[i]);
13591379

13601380
java_impl->env->SetShortArrayRegion(setArr, 0, array_size, fill);
13611381
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1382+
free(fill);
13621383
}
13631384
else if (!strcmp(fType, "[I"))
13641385
{
13651386
jintArray setArr = java_impl->env->NewIntArray((jsize)array_size);
13661387

1367-
jint fill[array_size];
1388+
jint *fill = (jint *)malloc(array_size * sizeof(jint));
13681389
for (size_t i = 0; i < array_size; i++)
13691390
fill[i] = (jint)value_to_int(array_value[i]);
13701391

13711392
java_impl->env->SetIntArrayRegion(setArr, 0, array_size, fill);
13721393
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1394+
free(fill);
13731395
}
13741396
else if (!strcmp(fType, "[J"))
13751397
{
13761398
jlongArray setArr = java_impl->env->NewLongArray((jsize)array_size);
13771399

1378-
jlong fill[array_size];
1400+
jlong *fill = (jlong *)malloc(array_size * sizeof(jlong));
13791401
for (size_t i = 0; i < array_size; i++)
13801402
fill[i] = (jlong)value_to_long(array_value[i]);
13811403

13821404
java_impl->env->SetLongArrayRegion(setArr, 0, array_size, fill);
13831405
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1406+
free(fill);
13841407
}
13851408
else if (!strcmp(fType, "[F"))
13861409
{
13871410
jfloatArray setArr = java_impl->env->NewFloatArray((jsize)array_size);
13881411

1389-
jfloat fill[array_size];
1412+
jfloat *fill = (jfloat *)malloc(array_size * sizeof(jfloat));
13901413
for (size_t i = 0; i < array_size; i++)
13911414
fill[i] = (jfloat)value_to_float(array_value[i]);
13921415

13931416
java_impl->env->SetFloatArrayRegion(setArr, 0, array_size, fill);
13941417
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1418+
free(fill);
13951419
}
13961420
else if (!strcmp(fType, "[D"))
13971421
{
13981422
jdoubleArray setArr = java_impl->env->NewDoubleArray((jsize)array_size);
13991423

1400-
jdouble fill[array_size];
1424+
jdouble *fill = (jdouble *)malloc(array_size * sizeof(jdouble));
14011425
for (size_t i = 0; i < array_size; i++)
14021426
fill[i] = (jdouble)value_to_double(array_value[i]);
14031427

14041428
java_impl->env->SetDoubleArrayRegion(setArr, 0, array_size, fill);
14051429
java_impl->env->SetStaticObjectField(clscls, fID, setArr);
1430+
free(fill);
14061431
}
14071432
else if (!strcmp(fType, "[Ljava/lang/String;"))
14081433
{

tools/metacall-environment.ps1

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,24 @@ function sub-wasm {
328328
# Java
329329
function sub-java {
330330
echo "configure java"
331+
$JAVA_VERSION = "17.0.5"
332+
$RuntimeDir = "$ROOT_DIR\build\runtimes\openjdk"
333+
334+
(New-Object Net.WebClient).DownloadFile("https://aka.ms/download-jdk/microsoft-jdk-$JAVA_VERSION-windows-x64.zip", "$(pwd)\openjdk.zip");
335+
Expand-Archive -Path "openjdk.zip" -DestinationPath "$RuntimeDir"
336+
robocopy /move /e "$RuntimeDir\jdk-$JAVA_VERSION+8" "$RuntimeDir" /NFL /NDL /NJH /NJS /NC /NS /NP
337+
338+
# Setting JAVA_HOME as a system level variable adding to doesn't work
339+
# [Environment]::SetEnvironmentVariable('JAVA_HOME', $RuntimeDir, 'Machine') -> this need elevated permissions
340+
341+
"JAVA_HOME=$RuntimeDir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
342+
"$RuntimeDir\bin" >> $env:GITHUB_PATH
331343

344+
# Add jvm.dll to path else loader fails while loading, also copying this dll won't work
345+
# since jvm.dll requires other dlls from the openjdk and then it fails to load its deps
346+
# Add-to-Path "$RuntimeDir\bin\server"
347+
"$RuntimeDir\bin\server" >> $env:GITHUB_PATH
348+
332349
}
333350

334351
# C

0 commit comments

Comments
 (0)