File: DirectArgumentsWrappersMarshalTest.java

package info (click to toggle)
libjna-java 5.15.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 11,828 kB
  • sloc: java: 90,222; ansic: 4,994; xml: 3,713; makefile: 433; sh: 299
file content (129 lines) | stat: -rw-r--r-- 4,934 bytes parent folder | download
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* Copyright (c) 2018 Matthias Bläsing, 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 java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Test native calls where the parameters and return types are bound as wrappers.
 *
 * <p>This variant of {@link ArgumentsWrappersMarshalTest} modified to use
 * direct mapping.</p>
 *
 * <p>The {@code PrimitiveConverter} was not made part of the core codebase,
 * as the usage would mean multiple trips through the C&lt;-&gt;Java barrier.
 * The converter is run on the java side, the invocation happens from the C side.
 * As the primary reason for direct mapping is performance, it is strongly
 * recommed not to go down this route, but map via java primitives.</p>
 */
public class DirectArgumentsWrappersMarshalTest extends ArgumentsWrappersMarshalTest {

    public static class DirectTestLibrary implements TestLibrary {
        @Override
        public native Boolean returnBooleanArgument(Boolean arg);
        @Override
        public native Byte returnInt8Argument(Byte arg);
        @Override
        public native Character returnWideCharArgument(Character arg);
        @Override
        public native Short returnInt16Argument(Short arg);
        @Override
        public native Integer returnInt32Argument(Integer i);
        @Override
        public native Long returnInt64Argument(Long l);
        @Override
        public native Float returnFloatArgument(Float f);
        @Override
        public native Double returnDoubleArgument(Double d);

        @Override
        public native Long checkInt64ArgumentAlignment(Integer i, Long j, Integer i2, Long j2);
        @Override
        public native Double checkDoubleArgumentAlignment(Float i, Double j, Float i2, Double j2);

        static {
            class PrimitiveConverter implements FromNativeConverter, ToNativeConverter {
                private final Class nativeType;

                public PrimitiveConverter(Class nativeType) {
                    this.nativeType = nativeType;
                }

                public Object fromNative(Object nativeValue, FromNativeContext context) {
                    if(nativeValue == null) {
                        return 0;
                    } else {
                        return nativeValue;
                    }
                }

                public Class<?> nativeType() {
                    return nativeType;
                }

                public Object toNative(Object value, ToNativeContext context) {
                    if(value == null) {
                        return 0;
                    } else {
                        return value;
                    }
                }
            }
            final Map<Class,PrimitiveConverter> converters = new HashMap<>();
            converters.put(Boolean.class, new PrimitiveConverter(boolean.class));
            converters.put(Byte.class, new PrimitiveConverter(byte.class));
            converters.put(Short.class, new PrimitiveConverter(short.class));
            converters.put(Character.class, new PrimitiveConverter(char.class));
            converters.put(Integer.class, new PrimitiveConverter(int.class));
            converters.put(Long.class, new PrimitiveConverter(long.class));
            converters.put(Float.class, new PrimitiveConverter(float.class));
            converters.put(Double.class, new PrimitiveConverter(double.class));
            TypeMapper tm = new TypeMapper() {
                public FromNativeConverter getFromNativeConverter(Class<?> javaType) {
                    return converters.get(javaType);
                }

                public ToNativeConverter getToNativeConverter(Class<?> javaType) {
                    return converters.get(javaType);
                }
            };
            NativeLibrary testlib = NativeLibrary.getInstance("testlib",
                    Collections.singletonMap(Library.OPTION_TYPE_MAPPER, tm));
            Native.register(testlib);
        }
    }

    /* Override original. */
    @Override
    protected void setUp() {
        lib = new DirectTestLibrary();
    }

    public static void main(java.lang.String[] argList) {
        junit.textui.TestRunner.run(DirectArgumentsWrappersMarshalTest.class);
    }

}