diff --git a/jni/README.md b/java-native/README.md
similarity index 100%
rename from jni/README.md
rename to java-native/README.md
diff --git a/java-native/pom.xml b/java-native/pom.xml
new file mode 100644
index 0000000000..29fc13b8d8
--- /dev/null
+++ b/java-native/pom.xml
@@ -0,0 +1,39 @@
+
+
+ 4.0.0
+ java-native
+ java-native
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ 5.6.0
+
+
+
+
+ net.java.dev.jna
+ jna-platform
+ ${jna.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/jni/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp b/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp
similarity index 100%
rename from jni/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp
rename to java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.cpp
diff --git a/jni/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h b/java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h
similarity index 100%
rename from jni/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h
rename to java-native/src/main/cpp/com_baeldung_jni_ExampleObjectsJNI.h
diff --git a/jni/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp b/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp
similarity index 100%
rename from jni/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp
rename to java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.cpp
diff --git a/jni/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h b/java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h
similarity index 100%
rename from jni/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h
rename to java-native/src/main/cpp/com_baeldung_jni_ExampleParametersJNI.h
diff --git a/jni/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp b/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp
similarity index 100%
rename from jni/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp
rename to java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.cpp
diff --git a/jni/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h b/java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h
similarity index 100%
rename from jni/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h
rename to java-native/src/main/cpp/com_baeldung_jni_HelloWorldJNI.h
diff --git a/jni/src/main/cpp/generateNativeLib.bat b/java-native/src/main/cpp/generateNativeLib.bat
similarity index 100%
rename from jni/src/main/cpp/generateNativeLib.bat
rename to java-native/src/main/cpp/generateNativeLib.bat
diff --git a/jni/src/main/cpp/generateNativeLib.sh b/java-native/src/main/cpp/generateNativeLib.sh
old mode 100755
new mode 100644
similarity index 100%
rename from jni/src/main/cpp/generateNativeLib.sh
rename to java-native/src/main/cpp/generateNativeLib.sh
diff --git a/jni/src/main/cpp/generateNativeLibMac.sh b/java-native/src/main/cpp/generateNativeLibMac.sh
old mode 100755
new mode 100644
similarity index 100%
rename from jni/src/main/cpp/generateNativeLibMac.sh
rename to java-native/src/main/cpp/generateNativeLibMac.sh
diff --git a/java-native/src/main/java/com/baeldung/jna/CMath.java b/java-native/src/main/java/com/baeldung/jna/CMath.java
new file mode 100644
index 0000000000..3ab5bdf48b
--- /dev/null
+++ b/java-native/src/main/java/com/baeldung/jna/CMath.java
@@ -0,0 +1,10 @@
+package com.baeldung.jna;
+
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.Platform;
+
+public interface CMath extends Library {
+ CMath INSTANCE = Native.load(Platform.isWindows() ? "msvcrt" : "c", CMath.class);
+ double cosh(double value);
+}
diff --git a/java-native/src/main/java/com/baeldung/jna/Main.java b/java-native/src/main/java/com/baeldung/jna/Main.java
new file mode 100644
index 0000000000..a81c878cde
--- /dev/null
+++ b/java-native/src/main/java/com/baeldung/jna/Main.java
@@ -0,0 +1,8 @@
+package com.baeldung.jna;
+
+public class Main {
+
+ public static void main(String[] args) {
+
+ }
+}
\ No newline at end of file
diff --git a/java-native/src/main/java/com/baeldung/jna/NativeFS.java b/java-native/src/main/java/com/baeldung/jna/NativeFS.java
new file mode 100644
index 0000000000..58f2bda035
--- /dev/null
+++ b/java-native/src/main/java/com/baeldung/jna/NativeFS.java
@@ -0,0 +1,46 @@
+package com.baeldung.jna;
+
+import java.util.Collections;
+import java.util.Map;
+
+import com.sun.jna.FunctionMapper;
+import com.sun.jna.LastErrorException;
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.NativeLong;
+import com.sun.jna.Platform;
+import com.sun.jna.Structure;
+import com.sun.jna.Structure.FieldOrder;
+
+public interface NativeFS extends Library {
+
+ FunctionMapper mapper = (library,method) -> {
+ if (Platform.isWindows()) {
+ return "_" + method.getName();
+ }
+ else {
+ return "__x" + method.getName(); // On Linux, stat is actually _xstat
+ }
+ };
+
+ public NativeFS INSTANCE = Native.load(Platform.isWindows() ? "msvcrt" : "c",
+ NativeFS.class,
+ Collections.singletonMap(Library.OPTION_FUNCTION_MAPPER, mapper));
+
+ int stat(String path, Stat stat) throws LastErrorException;
+
+ @FieldOrder({"st_dev","st_ino","st_mode","st_nlink","st_uid","st_gid","st_rdev","st_size","st_atime","st_mtime","st_ctime"})
+ public class Stat extends Structure {
+ public int st_dev;
+ public int st_ino;
+ public short st_mode;
+ public short st_nlink;
+ public short st_uid;
+ public short st_gid;
+ public int st_rdev;
+ public NativeLong st_size;
+ public NativeLong st_atime;
+ public NativeLong st_mtime;
+ public NativeLong st_ctime;
+ }
+}
diff --git a/java-native/src/main/java/com/baeldung/jna/StdC.java b/java-native/src/main/java/com/baeldung/jna/StdC.java
new file mode 100644
index 0000000000..1adbe684c4
--- /dev/null
+++ b/java-native/src/main/java/com/baeldung/jna/StdC.java
@@ -0,0 +1,17 @@
+package com.baeldung.jna;
+
+import com.sun.jna.LastErrorException;
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.Platform;
+import com.sun.jna.Pointer;
+
+public interface StdC extends Library {
+ StdC INSTANCE = Native.load(Platform.isWindows() ? "msvcrt" : "c", StdC.class );
+ Pointer malloc(long n);
+ void free(Pointer p);
+ Pointer memset(Pointer p, int c, long n);
+ int open(String path, int flags) throws LastErrorException;
+ int close(int fd) throws LastErrorException;
+}
+
diff --git a/jni/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java b/java-native/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java
similarity index 100%
rename from jni/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java
rename to java-native/src/main/java/com/baeldung/jni/ExampleObjectsJNI.java
diff --git a/jni/src/main/java/com/baeldung/jni/ExampleParametersJNI.java b/java-native/src/main/java/com/baeldung/jni/ExampleParametersJNI.java
similarity index 100%
rename from jni/src/main/java/com/baeldung/jni/ExampleParametersJNI.java
rename to java-native/src/main/java/com/baeldung/jni/ExampleParametersJNI.java
diff --git a/jni/src/main/java/com/baeldung/jni/HelloWorldJNI.java b/java-native/src/main/java/com/baeldung/jni/HelloWorldJNI.java
similarity index 100%
rename from jni/src/main/java/com/baeldung/jni/HelloWorldJNI.java
rename to java-native/src/main/java/com/baeldung/jni/HelloWorldJNI.java
diff --git a/jni/src/main/java/com/baeldung/jni/UserData.java b/java-native/src/main/java/com/baeldung/jni/UserData.java
similarity index 100%
rename from jni/src/main/java/com/baeldung/jni/UserData.java
rename to java-native/src/main/java/com/baeldung/jni/UserData.java
diff --git a/jni/src/main/resources/logback.xml b/java-native/src/main/resources/logback.xml
similarity index 100%
rename from jni/src/main/resources/logback.xml
rename to java-native/src/main/resources/logback.xml
diff --git a/java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java b/java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java
new file mode 100644
index 0000000000..a9cc6ed1c4
--- /dev/null
+++ b/java-native/src/test/java/com/baeldung/jna/CMathUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.jna;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.jupiter.api.Test;
+
+import com.sun.jna.Native;
+import com.sun.jna.Platform;
+
+class CMathUnitTest {
+ @Test
+ void whenCallNative_thenSuccess() {
+ CMath lib = Native.load(Platform.isWindows() ? "msvcrt" : "c", CMath.class);
+ double result = lib.cosh(0);
+ assertEquals(1.0,result);
+ }
+
+}
diff --git a/java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java b/java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java
new file mode 100644
index 0000000000..d296f9e2ca
--- /dev/null
+++ b/java-native/src/test/java/com/baeldung/jna/NativeFSUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.jna;
+
+import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.jna.NativeFS.Stat;
+import com.sun.jna.LastErrorException;
+import com.sun.jna.Platform;
+
+public class NativeFSUnitTest {
+
+
+ @Test
+ public void whenCallNative_thenSuccess() throws IOException {
+ NativeFS lib = NativeFS.INSTANCE;
+
+ File f = Files.createTempFile("junit", ".bin").toFile();
+ f.deleteOnExit();
+ Stat stat = new Stat();
+ try {
+ if (Platform.isWindows()) {
+ int rc = lib.stat(f.getAbsolutePath(), stat);
+ assertEquals(0, rc);
+ assertEquals(0,stat.st_size.longValue());
+ }
+ }
+ catch(LastErrorException error) {
+ fail("stat failed: error code=" + error.getErrorCode());
+ }
+
+ }
+}
diff --git a/java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java b/java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java
new file mode 100644
index 0000000000..c536fd63d5
--- /dev/null
+++ b/java-native/src/test/java/com/baeldung/jna/StdCUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.jna;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import org.junit.BeforeClass;
+import org.junit.jupiter.api.Test;
+
+import com.sun.jna.Native;
+import com.sun.jna.Platform;
+import com.sun.jna.Pointer;
+
+class StdCUnitTest {
+
+ @BeforeClass
+ public static void setupProtectedMode() {
+ Native.setProtected(true);
+ }
+
+ @Test
+ public void whenMalloc_thenSuccess() {
+ StdC lib = StdC.INSTANCE;
+ Pointer p = lib.malloc(1024);
+ p.setMemory(0l, 1024l, (byte) 0);
+ lib.free(p);
+ }
+
+ @Test
+ public void whenAccessViolation_thenShouldThrowError() {
+ // Running this test on Linux requires additional setup using libjsig.so
+ // Details here: http://java-native-access.github.io/jna/5.6.0/javadoc/overview-summary.html#crash-protection
+ // IMPORTANT NOTICE: Code for illustration purposes only. DON'T DO THIS IN YOUR OWN CODE
+ if ( Platform.isWindows()) {
+ Error e = null;
+ Pointer p = new Pointer(0l);
+
+ try {
+ p.setMemory(0, 100*1024, (byte) 0);
+ }
+ catch(Error err) {
+ e = err;
+ }
+
+ assertNotNull(e, "Should throw Error");
+ }
+ }
+
+}
diff --git a/jni/src/test/java/com/baeldung/jni/JNINativeManualTest.java b/java-native/src/test/java/com/baeldung/jni/JNINativeManualTest.java
similarity index 100%
rename from jni/src/test/java/com/baeldung/jni/JNINativeManualTest.java
rename to java-native/src/test/java/com/baeldung/jni/JNINativeManualTest.java
diff --git a/jni/native/linux_x86_64/libnative.so b/jni/native/linux_x86_64/libnative.so
deleted file mode 100755
index 213491e268..0000000000
Binary files a/jni/native/linux_x86_64/libnative.so and /dev/null differ
diff --git a/jni/native/macos/libnative.dylib b/jni/native/macos/libnative.dylib
deleted file mode 100755
index 6d1264d696..0000000000
Binary files a/jni/native/macos/libnative.dylib and /dev/null differ
diff --git a/jni/pom.xml b/jni/pom.xml
deleted file mode 100644
index d64fa12c5a..0000000000
--- a/jni/pom.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
- 4.0.0
- jni
- jni
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ab1c47361c..ac1a16a728 100644
--- a/pom.xml
+++ b/pom.xml
@@ -465,7 +465,7 @@
jjwt
jmeter
jmh
- jni
+ java-native
jooby
jsf
json
@@ -1501,4 +1501,4 @@
1.4.197
-
\ No newline at end of file
+