Skip to content

Commit d3b4379

Browse files
authored
Merge pull request #130 from javaevolved/copilot/simplify-c-code-java
Add "Calling out to C code from Java" pattern: JNI vs FFM API
2 parents 4ba22c3 + 361f9db commit d3b4379

14 files changed

Lines changed: 287 additions & 1 deletion

File tree

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
id: 113
3+
slug: "call-c-from-java"
4+
title: "Calling out to C code from Java"
5+
category: "language"
6+
difficulty: "advanced"
7+
jdkVersion: "22"
8+
oldLabel: "Java 1.1+"
9+
modernLabel: "Java 22+"
10+
oldApproach: "JNI (Java Native Interface)"
11+
modernApproach: "FFM (Foreign Function & Memory API)"
12+
oldCode: |-
13+
public class CallCFromJava {
14+
static { System.loadLibrary("strlen-jni"); }
15+
public static native long strlen(String s);
16+
public static void main(String[] args) {
17+
long ret = strlen("Bambi");
18+
System.out.println("Return value " + ret); // 5
19+
}
20+
}
21+
22+
// Run javac -h to generate the .h file, then write C:
23+
// #include "CallCFromJava.h"
24+
// #include <string.h>
25+
// JNIEXPORT jlong JNICALL Java_CallCFromJava_strlen(
26+
// JNIEnv *env, jclass clazz, jstring str) {
27+
// const char* s = (*env)->GetStringUTFChars(env, str, NULL);
28+
// jlong len = (jlong) strlen(s);
29+
// (*env)->ReleaseStringUTFChars(env, str, s);
30+
// return len;
31+
// }
32+
modernCode: |-
33+
void main() throws Throwable {
34+
try (var arena = Arena.ofConfined()) {
35+
// Use any system library directly โ€” no C wrapper needed
36+
var stdlib = Linker.nativeLinker().defaultLookup();
37+
var foreignFuncAddr = stdlib.find("strlen").orElseThrow();
38+
var strlenSig = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS);
39+
var strlenMethod = Linker.nativeLinker() .downcallHandle(foreignFuncAddr, strlenSig);
40+
var ret = (long) strlenMethod.invokeExact(arena.allocateFrom("Bambi"));
41+
IO.println("Return value " + ret); // 5
42+
}
43+
}
44+
45+
// Your own C library needs no special Java annotations:
46+
// long greet(char* name) {
47+
// printf("Hello %s\n", name);
48+
// return 0;
49+
// }
50+
summary: "FFM lets Java call C libraries directly, without JNI boilerplate or C-side Java knowledge."
51+
explanation: "Java has two approaches for calling native C/C++ code: the traditional\
52+
\ JNI and the modern FFM API. With JNI, you declare a method as native, run javac -h\
53+
\ to generate a C header file, then implement the function using the cumbersome JNI\
54+
\ C API (JNIEnv, jstring, etc.). FFM, introduced as a standard API in Java 22,\
55+
\ eliminates all of that: C code is just plain C โ€” no JNI conventions needed. This\
56+
\ makes it far easier to call existing C/C++ libraries without modification. The\
57+
\ Java side uses Arena for safe off-heap memory management and MethodHandle for the\
58+
\ downcall, ensuring both flexibility and safety."
59+
whyModernWins:
60+
- icon: "๐Ÿ‘"
61+
title: "C code stays plain C"
62+
desc: "The C function requires no JNI annotations or JNIEnv boilerplate โ€” any existing C library can be called as-is."
63+
- icon: "โšก"
64+
title: "More flexible"
65+
desc: "Directly call most existing C/C++ libraries without writing adapter code or generating header files."
66+
- icon: "๐Ÿ› ๏ธ"
67+
title: "Easier workflow"
68+
desc: "No need to stop, run javac -h, and implement the interface defined in the generated .h file."
69+
support:
70+
state: "available"
71+
description: "Standardized in JDK 22 (March 2024); previously incubating since JDK 14"
72+
prev: "language/compact-canonical-constructor"
73+
next: "enterprise/servlet-vs-jaxrs"
74+
related:
75+
- "io/file-memory-mapping"
76+
- "language/compact-source-files"
77+
- "language/unnamed-variables"
78+
docs:
79+
- title: "JEP 454: Foreign Function & Memory API"
80+
href: "https://openjdk.org/jeps/454"
81+
- title: "java.lang.foreign package (Java 22)"
82+
href: "https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/foreign/package-summary.html"

โ€Žcontent/language/compact-canonical-constructor.yamlโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ support:
4848
state: "available"
4949
description: "Widely available since JDK 16 (March 2021)"
5050
prev: "language/static-members-in-inner-classes"
51-
next: "enterprise/servlet-vs-jaxrs"
51+
next: "language/call-c-from-java"
5252
related:
5353
- "language/records-for-data-classes"
5454
- "language/flexible-constructor-bodies"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: "ุงุณุชุฏุนุงุก ูƒูˆุฏ C ู…ู† Java"
2+
oldApproach: "JNI (ูˆุงุฌู‡ุฉ Java ุงู„ุฃุตูŠู„ุฉ)"
3+
modernApproach: "FFM (ูˆุงุฌู‡ุฉ ุจุฑู…ุฌุฉ ุงู„ุฏูˆุงู„ ุงู„ุฎุงุฑุฌูŠุฉ ูˆุงู„ุฐุงูƒุฑุฉ)"
4+
summary: "ุชุชูŠุญ FFM ู„ู€ Java ุงุณุชุฏุนุงุก ู…ูƒุชุจุงุช C ู…ุจุงุดุฑุฉู‹ุŒ ุฏูˆู† ุงู„ุญุงุฌุฉ ุฅู„ู‰ ูƒู„ูŠุดูŠู‡ุงุช JNI ุฃูˆ ู…ุนุฑูุฉ Java ุนู„ู‰ ุฌุงู†ุจ C."
5+
explanation: "ุชู…ุชู„ูƒ Java ู†ู‡ุฌูŠู† ู„ุงุณุชุฏุนุงุก ูƒูˆุฏ C/C++ ุงู„ุฃุตูŠู„: JNI ุงู„ุชู‚ู„ูŠุฏูŠ ูˆูˆุงุฌู‡ุฉ FFM ุงู„ุญุฏูŠุซุฉ. ู…ุน JNIุŒ ุชูุนู„ู† ุนู† ุงู„ุฏุงู„ุฉ ุจูˆุตูู‡ุง nativeุŒ ุซู… ุชูุดุบู‘ู„ javac -h ู„ุชูˆู„ูŠุฏ ู…ู„ู ุชุฑูˆูŠุณุฉ CุŒ ูˆุชูู†ูู‘ุฐ ุงู„ุฏุงู„ุฉ ุจุงุณุชุฎุฏุงู… JNI C API ุงู„ู…ุนู‚ู‘ุฏุฉ (JNIEnv ูˆjstring ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒ). ุชูุฒูŠู„ FFM ุงู„ู…ูู‚ุฏูŽู‘ู…ุฉ ูƒูˆุงุฌู‡ุฉ ุจุฑู…ุฌุฉ ู‚ูŠุงุณูŠุฉ ููŠ Java 22 ูƒู„ ุฐู„ูƒ: ูƒูˆุฏ C ูŠุจู‚ู‰ C ุนุงุฏูŠุงู‹ โ€” ุฏูˆู† ุงู„ุญุงุฌุฉ ู„ุงุชูุงู‚ูŠุงุช JNI. ู‡ุฐุง ูŠูุณู‡ู‘ู„ ุงุณุชุฏุนุงุก ู…ูƒุชุจุงุช C/C++ ุงู„ู…ูˆุฌูˆุฏุฉ ุฏูˆู† ุชุนุฏูŠู„. ูŠุณุชุฎุฏู… ุงู„ุฌุงู†ุจ Java ูƒุงุฆู† Arena ู„ุฅุฏุงุฑุฉ ุงู„ุฐุงูƒุฑุฉ ุฎุงุฑุฌ ุงู„ูƒูˆู…ุฉ ุจุฃู…ุงู†ุŒ ูˆMethodHandle ู„ู„ุงุณุชุฏุนุงุก ุงู„ู†ุงุฒู„ุŒ ู…ู…ุง ูŠุถู…ู† ุงู„ู…ุฑูˆู†ุฉ ูˆุงู„ุฃู…ุงู†."
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: "ูƒูˆุฏ C ูŠุจู‚ู‰ C ู†ู‚ูŠุงู‹"
9+
desc: "ู„ุง ุชุญุชุงุฌ ุฏุงู„ุฉ C ุฅู„ู‰ ุชุนู„ูŠู‚ุงุช JNI ุฃูˆ ูƒู„ูŠุดูŠู‡ุงุช JNIEnv โ€” ูŠู…ูƒู† ุงุณุชุฏุนุงุก ุฃูŠ ู…ูƒุชุจุฉ C ู…ูˆุฌูˆุฏุฉ ู…ุจุงุดุฑุฉู‹."
10+
- icon: "โšก"
11+
title: "ุฃูƒุซุฑ ู…ุฑูˆู†ุฉ"
12+
desc: "ุงุณุชุฏุนู ู…ุนุธู… ู…ูƒุชุจุงุช C/C++ ุงู„ู…ูˆุฌูˆุฏุฉ ู…ุจุงุดุฑุฉู‹ ุฏูˆู† ูƒุชุงุจุฉ ูƒูˆุฏ ู…ุญูˆู‘ู„ ุฃูˆ ุชูˆู„ูŠุฏ ู…ู„ูุงุช ุชุฑูˆูŠุณุฉ."
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: "ุณูŠุฑ ุนู…ู„ ุฃุณู‡ู„"
15+
desc: "ู„ุง ุญุงุฌุฉ ู„ู„ุชูˆู‚ู ูˆุชุดุบูŠู„ javac -h ูˆุชู†ููŠุฐ ุงู„ูˆุงุฌู‡ุฉ ุงู„ู…ูุนุฑูŽู‘ูุฉ ููŠ ู…ู„ู .h ุงู„ู…ููˆูŽู„ูŽู‘ุฏ."
16+
support:
17+
description: "ุชู… ุชูˆุญูŠุฏู‡ ููŠ JDK 22 (ู…ุงุฑุณ 2024)ุ› ูƒุงู† ููŠ ู…ุฑุญู„ุฉ ุงู„ุญุถุงู†ุฉ ู…ู†ุฐ JDK 14"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: Java เฆฅเง‡เฆ•เง‡ C เฆ•เง‹เฆก เฆ•เฆฒ เฆ•เฆฐเฆพ
2+
oldApproach: JNI (Java Native Interface)
3+
modernApproach: FFM (Foreign Function & Memory API)
4+
summary: FFM เฆœเฆพเฆญเฆพเฆ•เง‡ JNI เฆฌเฆฏเฆผเฆฒเฆพเฆฐเฆชเงเฆฒเง‡เฆŸ เฆฌเฆพ C-เฆธเฆพเฆ‡เฆกเง‡ Java เฆœเงเฆžเฆพเฆจ เฆ›เฆพเฆกเฆผเฆพเฆ‡ เฆธเฆฐเฆพเฆธเฆฐเฆฟ C เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟ เฆ•เฆฒ เฆ•เฆฐเฆคเง‡ เฆฆเง‡เฆฏเฆผเฅค
5+
explanation: "Java-เฆคเง‡ เฆจเง‡เฆŸเฆฟเฆญ C/C++ เฆ•เง‹เฆก เฆ•เฆฒ เฆ•เฆฐเฆพเฆฐ เฆฆเงเฆŸเฆฟ เฆชเฆฆเงเฆงเฆคเฆฟ เฆฐเฆฏเฆผเง‡เฆ›เง‡: เฆเฆคเฆฟเฆนเงเฆฏเฆ—เฆค JNI เฆเฆฌเฆ‚ เฆ†เฆงเงเฆจเฆฟเฆ• FFM APIเฅค JNI-เฆเฆฐ เฆธเฆพเฆฅเง‡, เฆ†เฆชเฆจเฆฟ เฆเฆ•เฆŸเฆฟ เฆฎเง‡เฆฅเฆก native เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆ˜เง‹เฆทเฆฃเฆพ เฆ•เฆฐเง‡เฆจ, C เฆนเง‡เฆกเฆพเฆฐ เฆซเฆพเฆ‡เฆฒ เฆคเงˆเฆฐเฆฟ เฆ•เฆฐเฆคเง‡ javac -h เฆšเฆพเฆฒเฆพเฆจ, เฆคเฆพเฆฐเฆชเฆฐ เฆ•เฆทเงเฆŸเฆ•เฆฐ JNI C API (JNIEnv, jstring เฆ‡เฆคเงเฆฏเฆพเฆฆเฆฟ) เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡ เฆซเฆพเฆ‚เฆถเฆจ เฆ‡เฆฎเฆชเงเฆฒเฆฟเฆฎเง‡เฆจเงเฆŸ เฆ•เฆฐเง‡เฆจเฅค Java 22-เฆ เฆธเงเฆŸเงเฆฏเฆพเฆจเงเฆกเฆพเฆฐเงเฆก API เฆนเฆฟเฆธเง‡เฆฌเง‡ เฆชเงเฆฐเฆฌเฆฐเงเฆคเฆฟเฆค FFM เฆเฆ‡ เฆธเฆฌ เฆฌเฆพเฆฆ เฆฆเง‡เฆฏเฆผ: C เฆ•เง‹เฆก เฆถเงเฆงเง เฆธเฆพเฆงเฆพเฆฐเฆฃ C โ€” เฆ•เง‹เฆจเง‹ JNI เฆ•เฆจเฆญเง‡เฆจเฆถเฆจ เฆชเงเฆฐเฆฏเฆผเง‹เฆœเฆจ เฆจเง‡เฆ‡เฅค เฆเฆŸเฆฟ เฆชเฆฐเฆฟเฆฌเฆฐเงเฆคเฆจ เฆ›เฆพเฆกเฆผเฆพเฆ‡ เฆฌเฆฟเฆฆเงเฆฏเฆฎเฆพเฆจ C/C++ เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟ เฆ•เฆฒ เฆ•เฆฐเฆพ เฆ…เฆจเง‡เฆ• เฆธเฆนเฆœ เฆ•เฆฐเง‡ เฆคเง‹เฆฒเง‡เฅค Java เฆธเฆพเฆ‡เฆก เฆจเฆฟเฆฐเฆพเฆชเฆฆ เฆ…เฆซ-เฆนเฆฟเฆช เฆฎเง‡เฆฎเฆฐเฆฟ เฆฎเงเฆฏเฆพเฆจเง‡เฆœเฆฎเง‡เฆจเงเฆŸเง‡เฆฐ เฆœเฆจเงเฆฏ Arena เฆเฆฌเฆ‚ เฆกเฆพเฆ‰เฆจเฆ•เฆฒเง‡เฆฐ เฆœเฆจเงเฆฏ MethodHandle เฆฌเงเฆฏเฆฌเฆนเฆพเฆฐ เฆ•เฆฐเง‡, เฆฏเฆพ เฆจเฆฎเฆจเง€เฆฏเฆผเฆคเฆพ เฆเฆฌเฆ‚ เฆจเฆฟเฆฐเฆพเฆชเฆคเงเฆคเฆพ เฆ‰เฆญเฆฏเฆผเฆ‡ เฆจเฆฟเฆถเงเฆšเฆฟเฆค เฆ•เฆฐเง‡เฅค"
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: C เฆ•เง‹เฆก เฆธเฆพเฆฆเฆพเฆฎเฆพเฆŸเฆพ C-เฆ‡ เฆฅเฆพเฆ•เง‡
9+
desc: C เฆซเฆพเฆ‚เฆถเฆจเง‡ เฆ•เง‹เฆจเง‹ JNI เฆ…เงเฆฏเฆพเฆจเง‹เฆŸเง‡เฆถเฆจ เฆฌเฆพ JNIEnv เฆฌเฆฏเฆผเฆฒเฆพเฆฐเฆชเงเฆฒเง‡เฆŸ เฆชเงเฆฐเฆฏเฆผเง‹เฆœเฆจ เฆจเง‡เฆ‡ โ€” เฆฏเง‡เฆ•เง‹เฆจเง‹ เฆฌเฆฟเฆฆเงเฆฏเฆฎเฆพเฆจ C เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟ เฆฏเง‡เฆฎเฆจ เฆ†เฆ›เง‡ เฆคเง‡เฆฎเฆจเฆฟ เฆ•เฆฒ เฆ•เฆฐเฆพ เฆฏเฆพเฆฏเฆผเฅค
10+
- icon: "โšก"
11+
title: เฆ†เฆฐเฆ“ เฆจเฆฎเฆจเง€เฆฏเฆผ
12+
desc: เฆ…เงเฆฏเฆพเฆกเฆพเฆชเงเฆŸเฆพเฆฐ เฆ•เง‹เฆก เฆฒเง‡เฆ–เฆพ เฆฌเฆพ เฆนเง‡เฆกเฆพเฆฐ เฆซเฆพเฆ‡เฆฒ เฆคเงˆเฆฐเฆฟ เฆจเฆพ เฆ•เฆฐเง‡เฆ‡ เฆฌเง‡เฆถเฆฟเฆฐเฆญเฆพเฆ— เฆฌเฆฟเฆฆเงเฆฏเฆฎเฆพเฆจ C/C++ เฆฒเฆพเฆ‡เฆฌเงเฆฐเง‡เฆฐเฆฟ เฆธเฆฐเฆพเฆธเฆฐเฆฟ เฆ•เฆฒ เฆ•เฆฐเงเฆจเฅค
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: เฆธเฆนเฆœเฆคเฆฐ เฆ“เฆฏเฆผเฆพเฆฐเงเฆ•เฆซเงเฆฒเง‹
15+
desc: "เฆฅเฆพเฆฎเฆพเฆฐ, javac -h เฆšเฆพเฆฒเฆพเฆจเง‹เฆฐ เฆเฆฌเฆ‚ เฆœเง‡เฆจเฆพเฆฐเง‡เฆŸเง‡เฆก .h เฆซเฆพเฆ‡เฆฒเง‡ เฆธเฆ‚เฆœเงเฆžเฆพเฆฏเฆผเฆฟเฆค เฆ‡เฆจเงเฆŸเฆพเฆฐเฆซเง‡เฆธ เฆ‡เฆฎเฆชเงเฆฒเฆฟเฆฎเง‡เฆจเงเฆŸ เฆ•เฆฐเฆพเฆฐ เฆชเงเฆฐเฆฏเฆผเง‹เฆœเฆจ เฆจเง‡เฆ‡เฅค"
16+
support:
17+
description: JDK 22-เฆ เฆฎเฆพเฆจเฆธเฆฎเงเฆชเฆจเงเฆจ (เฆฎเฆพเฆฐเงเฆš 2024); เฆชเง‚เฆฐเงเฆฌเง‡ JDK 14 เฆฅเง‡เฆ•เง‡ เฆ‡เฆจเฆ•เฆฟเฆ‰เฆฌเง‡เฆŸเฆฟเฆ‚
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: "C-Code aus Java aufrufen"
2+
oldApproach: "JNI (Java Native Interface)"
3+
modernApproach: "FFM (Foreign Function & Memory API)"
4+
summary: "FFM ermรถglicht es Java, C-Bibliotheken direkt aufzurufen, ohne JNI-Boilerplate oder Java-Kenntnisse auf der C-Seite."
5+
explanation: "Java bietet zwei Ansรคtze zum Aufrufen von nativem C/C++-Code: das traditionelle JNI und die moderne FFM API. Bei JNI deklarieren Sie eine Methode als native, fรผhren javac -h aus, um eine C-Header-Datei zu generieren, und implementieren die Funktion mit der umstรคndlichen JNI-C-API (JNIEnv, jstring usw.). FFM, als Standard-API in Java 22 eingefรผhrt, eliminiert all das: C-Code bleibt reines C โ€” keine JNI-Konventionen erforderlich. Dies macht es viel einfacher, bestehende C/C++-Bibliotheken ohne ร„nderungen aufzurufen. Die Java-Seite verwendet Arena fรผr sicheres Off-Heap-Speichermanagement und MethodHandle fรผr den Downcall, was sowohl Flexibilitรคt als auch Sicherheit gewรคhrleistet."
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: "C-Code bleibt reines C"
9+
desc: "Die C-Funktion benรถtigt keine JNI-Annotationen oder JNIEnv-Boilerplate โ€” jede vorhandene C-Bibliothek kann direkt aufgerufen werden."
10+
- icon: "โšก"
11+
title: "Flexibler"
12+
desc: "Die meisten vorhandenen C/C++-Bibliotheken kรถnnen direkt aufgerufen werden, ohne Adaptercode zu schreiben oder Header-Dateien zu generieren."
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: "Einfacherer Workflow"
15+
desc: "Kein Stoppen, kein Ausfรผhren von javac -h und kein Implementieren der in der generierten .h-Datei definierten Schnittstelle."
16+
support:
17+
description: "In JDK 22 standardisiert (Mรคrz 2024); zuvor seit JDK 14 in der Inkubationsphase"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: Llamar a cรณdigo C desde Java
2+
oldApproach: JNI (Java Native Interface)
3+
modernApproach: FFM (Foreign Function & Memory API)
4+
summary: FFM permite a Java llamar directamente a bibliotecas C sin el cรณdigo repetitivo de JNI ni conocimiento de Java en el lado C.
5+
explanation: "Java tiene dos enfoques para llamar a cรณdigo nativo C/C++: el tradicional JNI y la moderna API FFM. Con JNI, se declara un mรฉtodo como native, se ejecuta javac -h para generar un archivo de encabezado C y se implementa la funciรณn usando la complicada API JNI de C (JNIEnv, jstring, etc.). FFM, introducida como API estรกndar en Java 22, elimina todo eso: el cรณdigo C es simplemente C puro โ€” sin necesidad de convenciones JNI. Esto facilita mucho la llamada a bibliotecas C/C++ existentes sin modificaciones. El lado Java usa Arena para la gestiรณn segura de memoria fuera del heap y MethodHandle para el downcall, garantizando flexibilidad y seguridad."
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: El cรณdigo C permanece como C puro
9+
desc: "La funciรณn C no requiere anotaciones JNI ni cรณdigo JNIEnv repetitivo โ€” cualquier biblioteca C existente puede llamarse tal cual."
10+
- icon: "โšก"
11+
title: Mรกs flexible
12+
desc: "Llama directamente a la mayorรญa de las bibliotecas C/C++ existentes sin escribir cรณdigo adaptador ni generar archivos de encabezado."
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: Flujo de trabajo mรกs sencillo
15+
desc: "No es necesario detenerse, ejecutar javac -h e implementar la interfaz definida en el archivo .h generado."
16+
support:
17+
description: Estandarizado en JDK 22 (marzo 2024); anteriormente en incubaciรณn desde JDK 14
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: Appeler du code C depuis Java
2+
oldApproach: JNI (Java Native Interface)
3+
modernApproach: FFM (Foreign Function & Memory API)
4+
summary: FFM permet ร  Java d'appeler directement des bibliothรจques C, sans code rรฉpรฉtitif JNI ni connaissance de Java cรดtรฉ C.
5+
explanation: "Java propose deux approches pour appeler du code natif C/C++ : le JNI traditionnel et la moderne API FFM. Avec JNI, vous dรฉclarez une mรฉthode comme native, exรฉcutez javac -h pour gรฉnรฉrer un fichier d'en-tรชte C, puis implรฉmentez la fonction en utilisant la lourde API JNI C (JNIEnv, jstring, etc.). FFM, introduite comme API standard dans Java 22, รฉlimine tout cela : le code C reste du C pur โ€” aucune convention JNI n'est requise. Cela facilite considรฉrablement l'appel de bibliothรจques C/C++ existantes sans modification. Le cรดtรฉ Java utilise Arena pour la gestion sรฉcurisรฉe de la mรฉmoire hors tas et MethodHandle pour le downcall, garantissant flexibilitรฉ et sรฉcuritรฉ."
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: Le code C reste du C pur
9+
desc: "La fonction C n'a besoin d'aucune annotation JNI ni de code JNIEnv rรฉpรฉtitif โ€” toute bibliothรจque C existante peut รชtre appelรฉe telle quelle."
10+
- icon: "โšก"
11+
title: Plus flexible
12+
desc: "Appelez directement la plupart des bibliothรจques C/C++ existantes sans รฉcrire de code adaptateur ni gรฉnรฉrer de fichiers d'en-tรชte."
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: Workflow simplifiรฉ
15+
desc: "Inutile de s'arrรชter, d'exรฉcuter javac -h et d'implรฉmenter l'interface dรฉfinie dans le fichier .h gรฉnรฉrรฉ."
16+
support:
17+
description: Standardisรฉ dans JDK 22 (mars 2024) ; auparavant en incubation depuis JDK 14
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: Chiamare codice C da Java
2+
oldApproach: JNI (Java Native Interface)
3+
modernApproach: FFM (Foreign Function & Memory API)
4+
summary: "FFM consente a Java di chiamare direttamente librerie C, senza boilerplate JNI nรฉ conoscenza di Java lato C."
5+
explanation: "Java offre due approcci per chiamare codice nativo C/C++: il tradizionale JNI e la moderna API FFM. Con JNI, si dichiara un metodo come native, si esegue javac -h per generare un file di intestazione C, quindi si implementa la funzione usando la complicata JNI C API (JNIEnv, jstring, ecc.). FFM, introdotta come API standard in Java 22, elimina tutto ciรฒ: il codice C rimane puro C โ€” nessuna convenzione JNI richiesta. Questo rende molto piรน semplice chiamare librerie C/C++ esistenti senza modifiche. Il lato Java usa Arena per la gestione sicura della memoria off-heap e MethodHandle per il downcall, garantendo flessibilitร  e sicurezza."
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: Il codice C rimane C puro
9+
desc: "La funzione C non richiede annotazioni JNI nรฉ boilerplate JNIEnv โ€” qualsiasi libreria C esistente puรฒ essere chiamata cosรฌ com'รจ."
10+
- icon: "โšก"
11+
title: Piรน flessibile
12+
desc: "Chiama direttamente la maggior parte delle librerie C/C++ esistenti senza scrivere codice adattatore nรฉ generare file di intestazione."
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: Flusso di lavoro piรน semplice
15+
desc: "Nessuna necessitร  di fermarsi, eseguire javac -h e implementare l'interfaccia definita nel file .h generato."
16+
support:
17+
description: Standardizzato in JDK 22 (marzo 2024); precedentemente in incubazione da JDK 14
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: Javaใ‹ใ‚‰Cใ‚ณใƒผใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™
2+
oldApproach: JNI๏ผˆJava Native Interface๏ผ‰
3+
modernApproach: FFM๏ผˆForeign Function & Memory API๏ผ‰
4+
summary: "FFMใ‚’ไฝฟใˆใฐใ€JNIใฎใƒœใ‚คใƒฉใƒผใƒ—ใƒฌใƒผใƒˆใ‚„CๅดใงใฎJavaใฎ็Ÿฅ่ญ˜ใชใ—ใซใ€Javaใ‹ใ‚‰Cใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’็›ดๆŽฅๅ‘ผใณๅ‡บใ›ใ‚‹ใ€‚"
5+
explanation: "Javaใซใฏใƒใ‚คใƒ†ใ‚ฃใƒ–ใช C/C++ ใ‚ณใƒผใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™2ใคใฎใ‚ขใƒ—ใƒญใƒผใƒใŒใ‚ใ‚Šใพใ™๏ผšๅพ“ๆฅใฎJNIใจใƒขใƒ€ใƒณใชFFM APIใงใ™ใ€‚JNIใงใฏใ€ใƒกใ‚ฝใƒƒใƒ‰ใ‚’nativeใจใ—ใฆๅฎฃ่จ€ใ—ใ€javac -hใ‚’ๅฎŸ่กŒใ—ใฆCใƒ˜ใƒƒใƒ€ใƒผใƒ•ใ‚กใ‚คใƒซใ‚’็”Ÿๆˆใ—ใ€็…ฉ้›‘ใชJNI C API๏ผˆJNIEnvใ€jstringใชใฉ๏ผ‰ใ‚’ไฝฟใฃใฆ้–ขๆ•ฐใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚Java 22ใงๆจ™ๆบ–APIใจใ—ใฆๅฐŽๅ…ฅใ•ใ‚ŒใŸFFMใฏใ€ใใฎใ™ในใฆใ‚’ไธ่ฆใซใ—ใพใ™๏ผšCใ‚ณใƒผใƒ‰ใฏใŸใ ใฎๆ™ฎ้€šใฎC โ€” JNIใฎๆ…ฃไพ‹ใฏไธ่ฆใงใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ๆ—ขๅญ˜ใฎC/C++ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ๅค‰ๆ›ดใชใ—ใซๅ‘ผใณๅ‡บใ™ใ“ใจใŒใฏใ‚‹ใ‹ใซๅฎนๆ˜“ใซใชใ‚Šใพใ™ใ€‚Javaใ‚ตใ‚คใƒ‰ใงใฏใ€ๅฎ‰ๅ…จใชใ‚ชใƒ•ใƒ’ใƒผใƒ—ใƒกใƒขใƒช็ฎก็†ใซArenaใ‚’ใ€ใƒ€ใ‚ฆใƒณใ‚ณใƒผใƒซใซMethodHandleใ‚’ไฝฟ็”จใ—ใ€ๆŸ”่ปŸๆ€งใจๅฎ‰ๅ…จๆ€งใฎไธกๆ–นใ‚’็ขบไฟใ—ใพใ™ใ€‚"
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: Cใ‚ณใƒผใƒ‰ใฏๆ™ฎ้€šใฎCใฎใพใพ
9+
desc: "C้–ขๆ•ฐใซJNIใ‚ขใƒŽใƒ†ใƒผใ‚ทใƒงใƒณใ‚‚JNIEnvใฎใƒœใ‚คใƒฉใƒผใƒ—ใƒฌใƒผใƒˆใ‚‚ไธ่ฆ โ€” ๆ—ขๅญ˜ใฎCใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ใใฎใพใพๅ‘ผใณๅ‡บใ›ใพใ™ใ€‚"
10+
- icon: "โšก"
11+
title: ใ‚ˆใ‚ŠๆŸ”่ปŸ
12+
desc: "ใ‚ขใƒ€ใƒ—ใ‚ฟใƒผใ‚ณใƒผใƒ‰ใ‚’ๆ›ธใ„ใŸใ‚Šใƒ˜ใƒƒใƒ€ใƒผใƒ•ใ‚กใ‚คใƒซใ‚’็”Ÿๆˆใ—ใŸใ‚Šใ›ใšใซใ€ใปใจใ‚“ใฉใฎๆ—ขๅญ˜C/C++ใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’็›ดๆŽฅๅ‘ผใณๅ‡บใ›ใพใ™ใ€‚"
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: ใƒฏใƒผใ‚ฏใƒ•ใƒญใƒผใŒ็ฐกๅ˜
15+
desc: "javac -hใ‚’ๅฎŸ่กŒใ—ใฆ็”Ÿๆˆใ•ใ‚ŒใŸ.hใƒ•ใ‚กใ‚คใƒซใงๅฎš็พฉใ•ใ‚ŒใŸใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚นใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹ใŸใ‚ใซไฝœๆฅญใ‚’ๆญขใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚"
16+
support:
17+
description: JDK 22ใงๆจ™ๆบ–ๅŒ–๏ผˆ2024ๅนด3ๆœˆ๏ผ‰๏ผ›JDK 14ใ‹ใ‚‰ใ‚คใƒณใ‚ญใƒฅใƒ™ใƒผใ‚ทใƒงใƒณไธญ
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
title: "Java์—์„œ C ์ฝ”๋“œ ํ˜ธ์ถœํ•˜๊ธฐ"
2+
oldApproach: "JNI (Java Native Interface)"
3+
modernApproach: "FFM (Foreign Function & Memory API)"
4+
summary: "FFM์€ JNI ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋‚˜ C ์ธก์˜ Java ์ง€์‹ ์—†์ด Java๊ฐ€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค."
5+
explanation: "Java์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ C/C++ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค: ์ „ํ†ต์ ์ธ JNI์™€ ํ˜„๋Œ€์ ์ธ FFM API์ž…๋‹ˆ๋‹ค. JNI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ native๋กœ ์„ ์–ธํ•˜๊ณ , javac -h๋ฅผ ์‹คํ–‰ํ•˜์—ฌ C ํ—ค๋” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ๋ฒˆ๊ฑฐ๋กœ์šด JNI C API(JNIEnv, jstring ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Java 22์—์„œ ํ‘œ์ค€ API๋กœ ๋„์ž…๋œ FFM์€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์—†์• ์ค๋‹ˆ๋‹ค: C ์ฝ”๋“œ๋Š” ๊ทธ๋ƒฅ ์ˆœ์ˆ˜ํ•œ C โ€” JNI ๊ทœ์•ฝ์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ธฐ์กด C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆ˜์ • ์—†์ด ํ›จ์”ฌ ์‰ฝ๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java ์ธก์—์„œ๋Š” ์•ˆ์ „ํ•œ ์˜คํ”„ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Arena๋ฅผ, ๋‹ค์šด์ฝœ์„ ์œ„ํ•ด MethodHandle์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์—ฐ์„ฑ๊ณผ ์•ˆ์ „์„ฑ์„ ๋ชจ๋‘ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค."
6+
whyModernWins:
7+
- icon: "๐Ÿ‘"
8+
title: "C ์ฝ”๋“œ๋Š” ์ˆœ์ˆ˜ํ•œ C ๊ทธ๋Œ€๋กœ"
9+
desc: "C ํ•จ์ˆ˜์—๋Š” JNI ์–ด๋…ธํ…Œ์ด์…˜์ด๋‚˜ JNIEnv ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค โ€” ๊ธฐ์กด C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
10+
- icon: "โšก"
11+
title: "๋” ์œ ์—ฐํ•จ"
12+
desc: "์–ด๋Œ‘ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํ—ค๋” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์กด C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
13+
- icon: "๐Ÿ› ๏ธ"
14+
title: "๋” ์‰ฌ์šด ์›Œํฌํ”Œ๋กœ"
15+
desc: "๋ฉˆ์ถฐ์„œ javac -h๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ƒ์„ฑ๋œ .h ํŒŒ์ผ์— ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."
16+
support:
17+
description: "JDK 22์—์„œ ํ‘œ์ค€ํ™”๋จ (2024๋…„ 3์›”); ์ด์ „์—๋Š” JDK 14๋ถ€ํ„ฐ ์ธํ๋ฒ ์ดํŒ…"

0 commit comments

Comments
ย (0)