1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
/* Copyright (c) 2022 Carlos Ballesteros, All Rights Reserved
*
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna;
import junit.framework.TestCase;
import java.util.Collections;
public class NativeCustomSymbolProviderTest extends TestCase implements Paths {
public static void main(java.lang.String[] argList) {
junit.textui.TestRunner.run(NativeCustomSymbolProviderTest.class);
}
interface MathInterfaceWithSymbolProvider extends Library {
double sin(double x);
double cos(double x);
}
static class MathLibraryWithSymbolProvider {
public static native double sin(double x);
public static native double cos(double x);
static {
Native.register(MathLibraryWithSymbolProvider.class, NativeLibrary.getInstance(Platform.MATH_LIBRARY_NAME, Collections.singletonMap(
Library.OPTION_SYMBOL_PROVIDER,
new SymbolProvider() {
@Override
public long getSymbolAddress(long handle, String name, SymbolProvider parent) {
if (name.equals("sin")) {
return parent.getSymbolAddress(handle, "cos", null);
} else {
return parent.getSymbolAddress(handle, "sin", null);
}
}
}
)));
}
}
MathInterfaceWithSymbolProvider lib;
MathInterfaceWithSymbolProvider libCustom;
@Override
protected void setUp() {
lib = Native.load(Platform.MATH_LIBRARY_NAME, MathInterfaceWithSymbolProvider.class);
libCustom = Native.load(
Platform.MATH_LIBRARY_NAME,
MathInterfaceWithSymbolProvider.class, Collections.singletonMap(
Library.OPTION_SYMBOL_PROVIDER,
new SymbolProvider() {
@Override
public long getSymbolAddress(long handle, String name, SymbolProvider parent) {
if (name.equals("sin")) {
return parent.getSymbolAddress(handle, "cos", null);
} else {
return parent.getSymbolAddress(handle, "sin", null);
}
}
}
)
);
}
@Override
protected void tearDown() {
lib = null;
libCustom = null;
}
public void testDirectMappingSymbolProvider() {
assertEquals(lib.cos(0.0), MathLibraryWithSymbolProvider.sin(0.0));
assertEquals(lib.sin(0.0), MathLibraryWithSymbolProvider.cos(0.0));
}
public void testInterfaceCustomSymbolProvider() {
assertEquals(lib.cos(0.0), libCustom.sin(0.0));
assertEquals(lib.sin(0.0), libCustom.cos(0.0));
}
}
|