JNI: native im Interface

KrokoDiehl

Top Contributor
Hallo zusammen. Ich habe eine Frage im Zusammenhang mit JNI, aber zuvor etwas Rahmenwissen:

Ich deklariere ein Java-Interface mit native-Methoden, was auch soweit funktioniert:
Java:
package de.abs.comm;
public interface CoreInterface
{
    // ...
    public native void coreCreateShell();
}
Dieses Interface lasse ich von einer Klasse implementieren und anderswo werden zB diese nativen Methoden aufgerufen. Java-seitig kompiliert es und scheint kein Problem soweit zu geben.

Wenn ich die C-Bibliothek erstelle funktioniert auch soweit alles: Via
Code:
javah
lasse ich mir eine Headerdatei erstellen, die natürlich auf das Java-Interface verweist:
Code:
JNIEXPORT jboolean JNICALL Java_de_abs_comm_CoreInterface_coreCreateShell
  (JNIEnv *, jobject);
Gut, DLL wird erstellt, die Methode wird auch exportiert. Lade ich die Bibliothek doch via Java und versuche die Methode aufzurufen, kommt ein Unsatisfied Link Error:
Code:
java.lang.UnsatisfiedLinkError: libshelladapter.dll: Die angegebene Prozedur wurde nicht gefunden
(ich nehme an dass er mit "Prozedur" die
Code:
coreCreateShell()
meint).

Ich habe JNI schon erfolgreich verwendet, es liegt nun am Sonderfall, dass die native Methode in einem Interface deklariert wird, die "ausführende" Klasse aber eine andere Java-Klasse ist und in JNI-Nomenklatur
Code:
Java_de_abs_comm_CoreInterfaceImpl_coreCreateShell()
(<-- vgl. das "impl") heißen würde.

Nun die Frage: Geht dies überhaupt, bzw. muss man hier etwas "spezielles" beachten?
 

KrokoDiehl

Top Contributor
Ist auch implementiert.
Aber ich habe eben festgestellt, dass der Fehler noch im
Code:
System.loadLibrary("...")
-Aufruf von Java geworfen wird, d.h. er kommt noch nicht zum Aufruf der eigentlichen nativen Methode. Aber wer weiß, ob das nicht doch damit zutun haben könnte.
 

Marco13

Top Contributor
:lol: Das war gemein ;)

Zugegeben: Ich habe noch nie versucht, eine native Funtkion in einem Interface unterzubringen. Eigentlich würde ich ja sagen: Mach' eine Websuche! Aber wenn man nach "Java Native Interface interface" sucht, findet man erstmal nicht spontan die Information, ob man JNI-Methoden in einem interface definieren kann .... :rolleyes:

Ein pragmatischer Test wäre, ein
Code:
class HelloWorldTest
{
    //... loadLibrary und main
    public static void main(String args)
    {
        HelloWorld h = new HelloWorld();
        h.sayIt();
    }
}
class HelloWorld
{
    public native void sayIt();
}
zu machen, die nativen Sachen dazu, und das dann auszuführen (das geht), und dann NUR die minimale Änderung zu machen
Code:
class HelloWorldTest
{
    //... loadLibrary und main
    public static void main(String args)
    {
        HelloWorld h = new HelloWorld[b]Impl[/b]();
        h.sayIt();
    }
}
[b]interface[/b] HelloWorld
{
    public native void sayIt();
}
[b]
class HelloWorldImpl
{
}
[/b]
und zu schauen, ob das dann noch funktioniert.
 

KrokoDiehl

Top Contributor
Ok, die Aufklärung des ganzen...

1) Man kann Methoden in einem Java-Interface nicht mit "native" deklarieren. Bei mir ist es eine abstrakte
Klasse mit native-Methoden. Das war mal wieder ein klassischer Fall, wo die Reihenfolge Denken-->Reden durcheinander gekommen ist :oops:
2) Auch wenn abstrakte Klasse und implementierende Klasse in unterschiedlichen Packages liegen, bzw. anders heißen, funktioniert die Namensauflösung (also Java findet die nativen Implementierungen).
3) Das Problem bei mir war etwas anderes (was genau weiß ich leider nicht), aber ich habe es dadurch gelöst bekommen, dass ich alle DLLs und JARs komplett neu erstellt habe. Ich vermute dass irgendeine abhängige DLL nicht gepasst hat, so etwas hatte ich schon öfters, jedoch noch nie diese Fehlermeldung.

Sprich, mein Problem hat sich quasi erledigt. Danke für eure Zeit :oops:
Ich schließe das Thema, sobald ich wirklich sicher bin, dass das mit den nativen Namen passt (...worum es in diesem Thema ja grundsätzlich geht).

*EDIT*
Ich kann es nun bestätigen: Man kann native Methoden in einer abstrakten Klasse deklarieren und sie von einer implementierenden Klasse benutzen lassen. Die Namen der C-Funktionen verweisen auf die abstrakte Klasse.
Mein Fehler hing tatsächlich mit abhängigen Bibliotheken zusammen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Java Native Interface und "mp3player" Allgemeine Java-Themen 3
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
minzel Java Native Interface Allgemeine Java-Themen 9
RalleYTN Classpath Native Dateien(DLL, SO, JNILIB) Allgemeine Java-Themen 2
A Linux: Native Library mit Rootrechten ohne Prozess mit sudo zu starten Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
reibi JNA - Native Acess - Library Path Allgemeine Java-Themen 2
G Native Library / Fehler beim Laden der .so/.dll Datei Allgemeine Java-Themen 17
L Native Bilbiothek exportieren Allgemeine Java-Themen 10
G RXTX native library unter Linux in jar build angeben Allgemeine Java-Themen 4
G Webstart Java Web Start und native Bibliotheken Allgemeine Java-Themen 3
KrokoDiehl thread-unsichere, native Bibliotheken Allgemeine Java-Themen 11
M Java Web Start - Native DLL einbinden Allgemeine Java-Themen 2
M Java native C# Allgemeine Java-Themen 2
F GCJ bzw. native Java-Programme Allgemeine Java-Themen 7
T Native Library ausliefern Allgemeine Java-Themen 12
J Native Library einbinden Allgemeine Java-Themen 17
B Native DLL zweimal laden: System.load(sPath); Allgemeine Java-Themen 5
S native methoden in try / catch ? Allgemeine Java-Themen 3
L Native Threads unter Linux? Allgemeine Java-Themen 2
G Java-Befehle Native und Static Allgemeine Java-Themen 2
M unable to create new native thread Allgemeine Java-Themen 6
S komplett in native kompilieren Allgemeine Java-Themen 6
G jar archiv und native klassen (pfad angabe) Allgemeine Java-Themen 2
C Java Native binding Code will nicht so ganz Allgemeine Java-Themen 2
M Threads (Native oder Green) Allgemeine Java-Themen 2
D unable to create new native thread Allgemeine Java-Themen 1
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
OnDemand Interface imlementieren Allgemeine Java-Themen 4
Buroto Interface Allgemeine Java-Themen 2
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
Kirby.exe Autocloseable Interface Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
mrBrown Namensfindung Fluent-Interface Allgemeine Java-Themen 0
J Logik in Interface Allgemeine Java-Themen 2
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
B eigenes Consumer Interface Allgemeine Java-Themen 0
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
N GUI Interface, swing Allgemeine Java-Themen 7
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
N Problem mit Generics und Interface Allgemeine Java-Themen 4
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface einer Library implementieren Allgemeine Java-Themen 3
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
Bananabert Interface Custom 'Event' mit Interface Allgemeine Java-Themen 10
J Interface Serializable Methodensignatur Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
F Interface IInterface oder Interface? Allgemeine Java-Themen 3
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
T Interface Probleme Allgemeine Java-Themen 8
M Queues und Queue Interface Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
pg1337 Interface-Frage Allgemeine Java-Themen 24
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
K Interface Interface comparable machen Allgemeine Java-Themen 9
T Interface > Abstract > Class Allgemeine Java-Themen 11
N Trick für Compilerfehler bei fehlendem Interface Allgemeine Java-Themen 12
X Interface - Klasse einladen Allgemeine Java-Themen 6
G Interface -> InterfaceImplementierung Allgemeine Java-Themen 3
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
R Interface instanzieren Allgemeine Java-Themen 8
B Frage zu Interface und List Allgemeine Java-Themen 4
S normale vererbung als interface Allgemeine Java-Themen 2
E Beispiel für ein möglichst einfaches Interface Allgemeine Java-Themen 22
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
S interface verbung problem Allgemeine Java-Themen 9
S problem programm mit interface: Allgemeine Java-Themen 3
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
B Interface und von Thread ableiten Allgemeine Java-Themen 6
R Interface Serializable technische Begrenzung Allgemeine Java-Themen 2
T Interface-Referenz Allgemeine Java-Themen 2
L interface abstrakte klasse Allgemeine Java-Themen 21
S Interface Geschäftslokik & GUI Allgemeine Java-Themen 6
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
C Schnittstellen(interface) Allgemeine Java-Themen 9
N List<? implements "Interface"> geht nicht Allgemeine Java-Themen 13
D javadoc interface + implementation + @overrides Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben