Connect with us

Künstliche Intelligenz

C-Libraries in Java nutzen 2: Funktionen mit veränderlichen Parametern


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Javas Foreign Function & 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üllen. 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.

Weiterlesen nach der Anzeige




Rudolf Ziegaus ist Software-Entwickler, Java-Trainer und Geschäftsführer der IO Software GmbH. Seine Lieblingsthemen sind PKi, Kryptographie und systemnahe Programmierung.

Nachdem der erste Teil gezeigt hat, wie man in Java eine in C geschriebene Shared Library lädt und einfache Funktionen dieser Shared Library aufruft, geht es jetzt um komplexere Szenarien. Er zeigt, wie man aus Java Funktionen mit veränderbaren Parametern aufrufen und Arrays sowie Strukturen übergeben kann.

Die bisherigen Beispiele haben die Aufrufe der nativen Funktionen einfach gehalten. Die Java-Anwendung hat lediglich Parameter durchgereicht und den Rückgabewert übernommen.

Anders sieht es bei den nächsten Beispielen aus. Als erstes folgt die einfache C-Funktion getVersion2, die wie die Funktion getVersion aus Teil 1 die Version der Library ermittelt. Die neue Funktion gibt die Versionsnummer aber nicht als Wert zurück, sondern verändert dazu einen Parameter. Das funktioniert in C, indem eine Anwendung für einen Parameter nicht den Wert selbst, sondern dessen Adresse übergibt (Call by Reference). Dieses Konstrukt sieht in C folgendermaßen aus:


EXPORT void   getVersion2(int* version);


Folgender Java-Code ruft die Funktion auf:

Weiterlesen nach der Anzeige


int version;
getVersion2(&version);


Das & kennzeichnet in C, dass die Funktion die Adresse der Variablen nutzt. Java erlaubt das Vorgehen nicht, sodass ein Rückgabewert unerlässlich ist. Folgende Java-Methode verwendet die C-Funktion mit Referenz:


public int getVersion2() throws Throwable
{
  MethodHandle method = getMethodHandle("getVersion2",   
     FunctionDescriptor.of(
				ValueLayout.JAVA_INT, 
				ValueLayout.ADDRESS
				));
  try (Arena arena = Arena.ofConfined())
  {
    MemorySegment versionSeg =   
      arena.allocate(ValueLayout.JAVA_INT.byteSize());
    method.invoke(versionSeg);
    int version = versionSeg.get(ValueLayout.JAVA_INT, 0);
    return version;
  }
}


Zuerst ruft der Code wie im ersten Teil der Serie wieder die Methode getMethodHandle() auf. Der Aufruf definiert den FunctionDescriptor für die Funktion getVersion2().

Die Angabe ValueLayout.ADDRESS für den Parameter zeigt an, dass die C-Funktion eine Adresse erwartet.

Jetzt kommt der spannendere Teil: Um eine Adresse übergeben zu können, muss die Java-Anwendung mittels der FFM-API einen Speicherbereich von vier Byte (für den Datentyp int) reservieren. Das geschieht mit einer Arena, die er erste Teil bereits erläutert hat. Das Erzeugen der Arena mit dem try-with-ressources-Statement stellt sicher, dass die Arena nach dem try-Block automatisch geschlossen und der darin verwaltete Speicher automatisch freigegeben wird. Es gibt verschiedene Typen von Arenas – die im Beispiel über ofConfined erzeugte sorgt dafür, dass die Anwendung nur auf Speicher des aktuellen Thread zugreifen kann. Eine mit ofConfined() erzeugte Arena – beziehungsweise der damit allozierte Speicher – ist daher nicht threadsicher.

Als nächstes gilt es, den erforderlichen Speicherbereich für den Parameter version zu allokieren. Dafür besitzt die Arena die Methode allocate(). Die Größe des benötigten Speichers kann man durch die Funktion byteSize() für die Variable ermitteln. Hier sei nochmals darauf hingewiesen, dass der Wert die Größe des Java-Datentyps darstellt und nicht zwingend etwas über den C-Datentyp aussagt. Da die C-Funktion einen int-Parameter entgegennimmt, sind wir auf der sicheren Seite, da int in C stets vier Byte umfasst. Bei einem long-Wert in C hängt die Größe dagegen von der Plattform ab.

Der Speicherbereich wird durch ein MemorySegment dargestellt, das beim Aufruf der Methode invoke an die C-Funktion weitergereicht werden muss.

Anschließend kann die Anwendung das Ergebnis auslesen. Dazu ruft sie auf dem MemorySegment die Funktion get auf und übergibt ihr das Layout des Speichers (in diesem Fall ein JAVA_INT) und den Offset zum Lesen aus dem MemorySegment. Für das Beispiel ist der Offset null. Durch die Angabe JAVA_INT gibt die Funktion einen int-Wert zurück, den die Anwendung weiterverarbeiten kann.

Die nächste Aufgabe baut auf dem Vorgehen auf, verarbeitet aber nicht nur einen Wert, sondern ermittelt den Durchschnitt aus einer Liste von int-Werten. Dazu muss sie der nativen Funktion ein Array von int-Werten übergeben:


public double calcAverage(int [] values) throws Throwable
{
  MethodHandle calcAverage =  
     getMethodHandle("calcAverage"),
	    FunctionDescriptor.of(
	    ValueLayout.JAVA_DOUBLE,     // return value 
	    ValueLayout.ADDRESS,         // data values 
	    ValueLayout.JAVA_INT));      // number of elements

  try(Arena arena = Arena.ofConfined())  
  {
    long totalSize = ValueLayout.JAVA_INT.byteSize() * values.length;
    MemorySegment valueSegment = arena.allocate(totalSize);
    for (int i = 0; i < values.length; i++) 
    {
      valueSegment.setAtIndex(ValueLayout.JAVA_INT, i, values[i]); 
    }
    double result = (double) calcAverage.invoke(valueSegment, 
                                                values.length);
    return result;
  }
}


Zunächst berechnet der Code die gesamte Speichergröße des Arrays (totalSize) und reserviert den benötigten Speicher mit allocate(). Anschließend belegt der Code den Speicher mit der Methode setAtIndex für das jeweilige MemorySegment. Der Aufruf erfolgt für jedes Element des Arrays.

Schließlich ruft der Code die Methode invoke für den MethodHandle auf und übergibt ihr als Parameter das Array und dessen Länge. Schließlich gibt sie das Ergebnis der C-Funktion zurück.



Source link

Künstliche Intelligenz

Bahnausfall: Wartungsarbeiten künftig nur von 0 bis 4 Uhr


Nach zuerst nur stückweisen und zögerlichen Erklärungen zum bundesweiten Ausfall des Zugverkehrs hat die Deutsche Bahn nun einige technische Details zu den Ursachen vorgelegt. Ebenso soll es für künftige Wartungsarbeiten neue Regeln geben, denn: laut Bahn „planmäßige Instandhaltungsarbeiten“ hatten zum Stillstand aller Züge geführt. Von einem fehlgeschlagenen Softwareupdate hatten in der fraglichen Nacht bereits dpa und SWR berichtet, die Bahn hat das nun bestätigt.

Weiterlesen nach der Anzeige

In einem am Freitag veröffentlichten Blogbeitrag beschreibt die Deutsche Bahn, dass der Austausch eines Netzwerk-Switches ursächlich die Probleme verursacht hat. Dabei habe es dann, so wörtlich, einen „singulären Softwarefehler“ gegeben, aber keine Fehlermeldung. Das resultierte in einem Ausfall des Mobilfunksystems GSM-R, ohne das Züge nicht fahren dürfen. Für GSM-R gibt es laut Bahn zwar ein redundantes System – das wurde aber nicht automatisch aktiviert. Es scheint, als wäre diese Umschaltung von einer Fehlermeldung abhängig gewesen, diese blieb aber wie beschrieben aus.

Für einen solchen Fall, schreibt die Bahn, ist zunächst ein Cyberangriff auszuschließen. Das erscheint sinnvoll, denn in solchen Fällen könnte man seinen eigenen Systemen nicht mehr trauen. Durch übereilte Gegenmaßnahmen an der falschen Stelle können dann die Probleme nur größer werden. Nach 90 Minuten haben dann Mitarbeiter der Bahn manuell die „Rückfallebene“ aktiviert, die Züge konnten wieder fahren.

Das deckt sich mit Beobachtungen von heise online und zahlreichen Berichten von Reisenden: Schon gegen 0:30 Uhr bewegten sich einige Züge wieder. Die ersten Meldungen von im Bahnverkehr beschäftigten Personen über den Ausfall von GSM-R und damit des gesamten Zugverkehrs gab es gegen 22:20 Uhr. Zum zuerst befürchteten Verkehrschaos am Mittwochmorgen kam es nicht. Bei längeren Ausfällen von zentralen Bahnsystemen ist das zwangsläufig der Fall, weil Personal und Züge sich nicht da befinden, wo sie sein sollten.

Um solche Ausfälle zu vermeiden, hat die Bahn drei Maßnahmen ergriffen: Vorerst soll es keinen Austausch von Komponenten mehr geben, mit dem Hersteller des Switches soll der Fehler behoben werden. Und wohl am wichtigsten, und von Beobachtern häufig gefordert: Instandhaltungsarbeiten sollen nur noch von 0 Uhr nachts bis 4 Uhr morgens durchgeführt werden. Dann fahren auf deutschen Schienen fast nur Güterzüge, die ohne große Folgeprobleme auch auf freier Strecke anhalten können.

Weiterlesen nach der Anzeige

Der Chef der Schienen, der Vorstandsvorsitzende der DB InfraGO, Philipp Nagl, beschreibt in dem Blogeintrag zudem, dass man derzeit für GSM-R die „Rückfallebene über den öffentlichen Mobilfunk“ neu aufstellen würde. An der Sanierung von GSM-R arbeitet die Bahn laut Nagl schon länger, es soll unter anderem resilienter werden. Noch mindestens zehn Jahre soll das auf 2G basierende System der Bahn noch gebraucht werden, erst dann soll nur noch der Zugfunk-Standard FRMCS (Future Railway Mobile Communication System) genutzt werden. Aber, so die Bahn: FRMCS sei durch die Europäische Union noch nicht spezifiziert, daher könnten Komponenten dafür auch weder bestellt noch verbaut werden.

Lesen Sie auch


(nie)



Source link

Weiterlesen

Künstliche Intelligenz

Bundestag beschließt Recht auf Reparatur von Elektrogeräten


Deutschlands Verbraucher haben künftig ein Recht auf Reparatur. Der Bundestag beschloss am Abend die Umsetzung einer EU-Richtlinie, die sich gegen die weit verbreitete Wegwerf-Mentalität richtet. Hersteller von Waschmaschinen, Mobiltelefonen, Tablets oder E-Bikes werden damit gesetzlich verpflichtet, ihre Produkte während der üblichen Lebensdauer zu einem angemessenen Preis zu reparieren.

Weiterlesen nach der Anzeige

Außerdem müssen die Geräte künftig so konstruiert sein, dass man sie reparieren kann. Wer also etwa den Akku so verbaut, dass ein Tausch nicht möglich ist, verstößt gegen das neue Gesetz. Die Neuregelung sieht auch Anreize für die Verbraucher vor: Entscheiden sie sich für eine Reparatur statt für den Tausch eines defekten Geräts, verlängert sich eine laufende Gewährleistungsfrist um zwölf Monate.

Der Branchenverband der Informations- und Telekommunikationsbranche, Bitkom, sieht dadurch Vorteile für Verbraucher und Umwelt. „Wer Smartphone, Tablet oder Laptop länger nutzt, spart Geld, vermeidet Elektroschrott und schont Ressourcen“, erklärt Bitkom-Hauptgeschäftsführer Bernhard Rohleder. Auch der Verbraucherzentrale Bundesverband begrüßt die Neuregelung, fordert aber darüber hinaus einen von den Herstellern finanzierten Reparaturbonus, um das Reparieren insgesamt attraktiver zu machen.


(mho)



Source link

Weiterlesen

Künstliche Intelligenz

US-Regierung lässt Zugang zu neuer KI von OpenAI beschränken


Der ChatGPT-Entwickler OpenAI schränkt auf Forderung der US-Regierung den Zugang zu seinem neuesten KI-Modell ein. Zugriff auf die Vorschau-Version von Modellen der GPT-5.6-Reihe bekomme nur eine abgestimmte kleine Gruppe von Partnern, denen man vertraue, teilte OpenAI mit. Die eingeschränkte Veröffentlichung sei von der Regierung verlangt worden.

Weiterlesen nach der Anzeige

Die Freigaben seien zunächst nur in den USA erteilt worden, hieß es von OpenAI. Man arbeite daran, auch Partnern aus anderen Ländern Zugang zu geben, dies könne bereits kommende Woche passieren. OpenAI schränkte zugleich ein, man glaube nicht, dass solche Zugangskontrollen der Behörden langfristig zur Norm werden sollen. Derzeit sehe man das Einverständnis damit als besten Weg, um in den kommenden Wochen den Zugang zu erweitern.

Diese Feststellung kann man als Hinweis auf Probleme des Rivalen Anthropic verstehen. Die Firma hatte ihr neues leistungsstärkstes Modell zunächst veröffentlicht – und musste es dann wenige Tage später auf Forderung der US-Regierung wieder zurückziehen. Auslöser waren Warnungen, dass Vorkehrungen gegen einen Missbrauch der Software möglicherweise ausgehebelt werden könnten.

Das neue KI-Modell von Anthropic ist besonders gut darin, Schwachstellen in Software zu finden. Das macht Programme sicherer – in den falschen Händen könnte eine solche KI aber als Cyberwaffe eingesetzt werden. Die US-Regierung forderte aber, dass nur amerikanische Firmen und Personen Zugang zu dem KI-Modell haben dürften.

Beim neuen OpenAI-Modell GPT-5.6 kann die leistungsstärkste Variante mit dem Namen „Sol“ der Firma zufolge eigenständig Aufgaben beim Programmieren sowie in Biologie und Cybersicherheit ausführen. Man habe Schutzvorkehrungen gegen einen Missbrauch getroffen, betonte OpenAI. Zugleich könne man bei Bewertungen nicht jede mehrstufige Attacke berücksichtigen, warnte das Unternehmen.

Lesen Sie auch


(nie)



Source link

Weiterlesen

Beliebt