{"id":86505,"date":"2026-04-17T08:56:12","date_gmt":"2026-04-17T08:56:12","guid":{"rendered":"https:\/\/www.europesays.com\/ch-de\/86505\/"},"modified":"2026-04-17T08:56:12","modified_gmt":"2026-04-17T08:56:12","slug":"c-libraries-in-java-nutzen-1-grundlagen-der-foreign-function-memory-api","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ch-de\/86505\/","title":{"rendered":"C-Libraries in Java nutzen 1: Grundlagen der Foreign Function &#038; Memory API"},"content":{"rendered":"<p>    close notice<\/p>\n<p class=\"notice-banner__text a-u-mb-0\">\n      This article is also available in<br \/>\n        <a href=\"https:\/\/www.heise.de\/en\/background\/Using-C-Libraries-in-Java-1-Fundamentals-of-the-Foreign-Function-Memory-API-11258727.html\" class=\"notice-banner__link a-u-inline-link\" rel=\"nofollow noopener\" target=\"_blank\">English<\/a>.<\/p>\n<p>      It was translated with technical assistance and editorially reviewed before publication.\n    <\/p>\n<p class=\"notice-banner__link a-u-mb-0\">\n    Don\u2019t show this again.\n<\/p>\n<p>Javas Foreign Function &amp; Memory API (FFM) dient dazu, auf Code in einer Shared Library beziehungsweise DLL zuzugreifen, der in einer Programmiersprache wie C oder Rust geschrieben ist. Allerdings muss der Code dazu einige Voraussetzungen erf\u00fcllen. Diese dreiteilige Artikelserie zeigt anhand einer in C geschriebenen Demo-Library, wie eine Java-Anwendung die Funktionen der Bibliothek aufruft, welche Vorbereitungen erforderlich sind und welche Regeln zu beachten sind. Der Sammelbegriff \u201eShared Library\u201c steht in den Artikeln gleicherma\u00dfen f\u00fcr eine Shared Library unter Unix wie f\u00fcr eine Windows-DLL.<\/p>\n<p>        Weiterlesen nach der Anzeige<\/p>\n<p>    <img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"4928\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 3264 \/ 4928; object-fit: cover;\" width=\"3264\"\/><\/p>\n<p class=\"a-inline-textbox__synopsis\">\n          Rudolf Ziegaus ist Software-Entwickler, Java-Trainer und Gesch\u00e4ftsf\u00fchrer der IO Software GmbH.  Seine Lieblingsthemen sind PKi, Kryptographie und systemnahe Programmierung.\n        <\/p>\n<p>Der Ausgangspunkt der Arbeit mit FFM war meine Suche nach einem Weg, per Java auf ein Hardware-Sicherheitsmodul (HSM) zuzugreifen. Da aber noch kein physisches HSM vorhanden war, suchte ich nach einer softwaregest\u00fctzten Umsetzung. Die Applikation SoftHSM2 l\u00e4sst sich mit PKCS11 ansprechen, aber der Pkcs#11-Treiber von Sun ist veraltet. Da ich keine passende Open-Source-Anwendung gefunden habe, entwickelte ich selbst einen PKCS11-Wrapper f\u00fcr Java auf Basis der FFM-API.<\/p>\n<p>Da das Projekt sehr umfangreich ist, steht f\u00fcr diese dreiteilige Artikelserie eine eigens entwickelte C-Library im Fokus, die dazu dient, die Konzepte der FFM-API zu erl\u00e4utern. <a href=\"https:\/\/github.com\/rz259\/ffm-demo\/\" rel=\"external noopener nofollow\" target=\"_blank\">Die kleine Demo-Library<\/a> ist auf Windows und Linux getestet.<\/p>\n<p>Ein wenig Historie<\/p>\n<p>In Java gab es vor dem FFM mit dem Java Native Interface (JNI) seit Langem einen Weg, um auf in C geschriebenen Code zuzugreifen. Das JNI war allerdings sehr kompliziert und fehlerbehaftet.<\/p>\n<p>Daher begannen im JDK 14 (Java Development Kit) die Arbeiten an einer neuen Schnittstelle: <a href=\"https:\/\/openjdk.org\/jeps\/454\" rel=\"external noopener nofollow\" target=\"_blank\">Foreign Function &amp; Memory API<\/a>. Die Java-Community hat sie \u00fcber einige JDK-Versionen und JEPs hinweg verfeinert und schlie\u00dflich in JDK 22 finalisiert. Allerdings <a href=\"https:\/\/www.heise.de\/blog\/Java-Die-nicht-so-bekannten-Features-des-OpenJDK-24-10322221.html\" rel=\"nofollow noopener\" target=\"_blank\">erschien sie im JDK 24<\/a> nochmals in ver\u00e4nderter Form. Wegen einiger Breaking Changes ist die API aus Java 24 nicht zu der in Java 22 kompatibel. Dieser Artikel beschreibt die aktuelle Version aus dem JDK 24.<\/p>\n<p>        Weiterlesen nach der Anzeige<\/p>\n<p>Um die FFM-API zu nutzen, gelten folgende Voraussetzungen:<\/p>\n<p>Ein JDK ab Version 24 muss installiert sein.Das Betriebssystem muss Windows oder Linux auf x64-Basis sein. Die Demo-App sollte auch unter macOS funktionieren, wozu ich aber keine Tests durchgef\u00fchrt habe.Eine Windows-DLL oder eine Shared Library f\u00fcr Linux in 64-Bit-Version muss vorhanden sein.Die DLL beziehungsweise Shared Library muss in einer Sprache geschrieben sein, die die C-ABI (Application Binary Interface) unterst\u00fctzt. Dazu geh\u00f6ren neben C und C++ (mit passend deklarierten Funktionen) auch weitere Sprachen wie Rust und Go.Beim Zugriff auf die Shared Library muss man den Native Access erlauben. Das ist aktuell noch ohne Einschr\u00e4nkungen m\u00f6glich, was sich in einer sp\u00e4teren Java-Version \u00e4ndern k\u00f6nnte.<br \/>\nBeschreibung der DemoLib<\/p>\n<p>Der Ausgangspunkt f\u00fcr FFM ist immer eine Header-Datei, die in C die Funktionen und gegebenenfalls Typen der Shared Library beschreibt.<\/p>\n<p>Die in C entwickelte Beispiel-Library enth\u00e4lt nur wenige Funktionen und einen Datentyp:<\/p>\n<p>#ifdef _WIN32<br \/>\n  #define EXPORT __declspec(dllexport)<br \/>\n#else<br \/>\n  #define EXPORT<br \/>\n#endif<\/p>\n<p>typedef struct<br \/>\n{<br \/>\n  double x;<br \/>\n  double y;<br \/>\n} Point;<\/p>\n<p>#define VERSION 1<\/p>\n<p>EXPORT void   initialize(void);<br \/>\nEXPORT int    getVersion(void);<br \/>\nEXPORT void   getVersion2(int *version);<br \/>\nEXPORT long   add(long a, long b);<br \/>\nEXPORT double calcAverage(int *lvalues, int size);<br \/>\nEXPORT double distance(Point *p1, Point *p2);<\/p>\n<p>Es gibt nur eine einzige Typdefinition (Point) und wenige Funktionen. Die Direktive #ifdef im Header-File sorgt daf\u00fcr, dass sich der Code sowohl unter Linux als auch unter Windows kompilieren l\u00e4sst.<\/p>\n<p>Toolanbindung mit Stolperfallen<\/p>\n<p><a href=\"https:\/\/github.com\/openjdk\/jextract\" rel=\"external noopener nofollow\" target=\"_blank\">Das Tool jextract<\/a> hilft beim Zugriff auf native Funktionen. Ausgangspunkt ist auch hier wieder eine Header-Datei, um die notwendigen Zugriffsmethoden f\u00fcr die Funktionen aus der Shared Library zu erzeugen.<\/p>\n<p>jextract k\u00e4mpft jedoch mit diversen Schwierigkeiten. Zun\u00e4chst ist es nicht f\u00fcr jedes JDK verf\u00fcgbar \u2013 nach JDK 22 erst wieder f\u00fcr JDK 25. F\u00fcr die Demo-Library zum Artikel hat die Version aus JDK 22 zwei Klassen generiert: Point f\u00fcr den Zugriff auf die Datenstruktur und DemoLib_h, um auf die Funktionen zuzugreifen. Die Klasse Point hat einen Umfang von etwa 170 schlecht leserlichen Codezeilen, und die Klasse DemoLib_h hat weitere 390 Zeilen Code, die ebenfalls schwer lesbar sind.<\/p>\n<p>Bei komplexen Header-Files ist der Einsatz von jextract noch schwieriger. Beim Versuch, einen Wrapper f\u00fcr PKCS11 zu erzeugen, brach jextract im Zusammenspiel mit dem JDK 22 ab. Die Header-Datei pkcs11.h l\u00e4dt zwei weitere Header-Dateien nach. Das f\u00fchrte zum Abbruch mit Fehlermeldungen, dass inkompatible Typ-Redefinitionen vorhanden seien.<\/p>\n<p>jextract ist derzeit nur f\u00fcr kleine Projekte einsatzbereit \u2013 und auch das mit Einschr\u00e4nkungen. Aufgrund des schwer lesbaren Codes ist es keine Vorlage f\u00fcr eigenen Code. Daher ist der deutlich bessere Ansatz, den Code selbst zu entwickeln und das entsprechende Know-how aufzubauen, um den Code zu verstehen.<\/p>\n<p>\n      Dieser Link ist leider nicht mehr g\u00fcltig.\n    <\/p>\n<p>Links zu verschenkten Artikeln werden ung\u00fcltig,<br \/>\n      wenn diese \u00e4lter als 7\u00a0Tage sind oder zu oft aufgerufen wurden.\n    <\/p>\n<p>Sie ben\u00f6tigen ein heise+ Paket, um diesen Artikel zu lesen. Jetzt eine Woche unverbindlich testen \u2013 ohne Verpflichtung!<\/p>\n","protected":false},"excerpt":{"rendered":"close notice This article is also available in English. It was translated with technical assistance and editorially reviewed&hellip;\n","protected":false},"author":2,"featured_media":86506,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[46,15622,622,19372,24007,45,60,59,4783,44,64,61,63,62],"class_list":{"0":"post-86505","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-wissenschaft-technik","8":"tag-ch","9":"tag-developer","10":"tag-it","11":"tag-java","12":"tag-schnittstellen","13":"tag-schweiz","14":"tag-science","15":"tag-science-technology","16":"tag-softwareentwicklung","17":"tag-switzerland","18":"tag-technik","19":"tag-technology","20":"tag-wissenschaft","21":"tag-wissenschaft-technik"},"share_on_mastodon":{"url":"https:\/\/pubeurope.com\/@ch_de\/116419210326775143","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/posts\/86505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/comments?post=86505"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/posts\/86505\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/media\/86506"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/media?parent=86505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/categories?post=86505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ch-de\/wp-json\/wp\/v2\/tags?post=86505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}