Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mcimadamore committed May 14, 2024
1 parent e003c4e commit ba36c54
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
66 changes: 66 additions & 0 deletions test/jdk/java/foreign/jniSupport/TestJNISupport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

/*
* @test
* @library ../ /test/lib
* @build NativeTestHelper
* @run testng/othervm --enable-native-access=ALL-UNNAMED TestJNISupport
*/

import org.testng.annotations.Test;

import java.lang.foreign.Arena;
import java.lang.foreign.JNISupport;
import java.lang.foreign.FunctionDescriptor;
import java.lang.foreign.MemorySegment;
import java.lang.invoke.MethodHandle;

import static org.testng.Assert.*;

public class TestJNISupport extends NativeTestHelper {

static {
System.loadLibrary("JNISupport");
}

private record Widget(int x) {}

@Test
public void testUpcallWithRef() throws Throwable {
MethodHandle upcallWithRef = downcallHandle("upcall_with_ref", FunctionDescriptor.ofVoid(C_POINTER, C_POINTER));

try (Arena arena = Arena.ofConfined()) {
MemorySegment ref = JNISupport.newGlobalRef(new Widget(42), arena);
MemorySegment stub = upcallStub(TestJNISupport.class, "target", FunctionDescriptor.ofVoid(C_POINTER));

upcallWithRef.invokeExact(ref, stub);
}
}

public static void target(MemorySegment ref) {
Widget w = (Widget) JNISupport.resolveGlobalRef(ref);

assertEquals(w.x(), 42);
}
}
32 changes: 32 additions & 0 deletions test/jdk/java/foreign/jniSupport/libJNISupport.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

#ifdef _WIN64
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif

EXPORT void upcall_with_ref(void* ref, void(*cb)(void*)) {
cb(ref);
}

0 comments on commit ba36c54

Please sign in to comment.