Toon posts:

[JNI] Java-C++ koppeling

Pagina: 1
Acties:

Verwijderd

Topicstarter
Vanuit m'n Java-programma wil ik graag een C++-methode aanroepen. Op zich zou dit via JNI niet zo moeilijk moeten zijn, maar ik krijg het niet werkend. Ik heb in Java een class gemaakt met een native method learn() erin, deze gecompileerd, en vervolgens javah -jni TrainerClass gedaan. Dit levert de volgende headerfile op:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TrainerClass */

#ifndef _Included_TrainerClass
#define _Included_TrainerClass
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TrainerClass
 * Method:    learn
 * Signature: ([[IIILjava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_TrainerClass_learn
  (JNIEnv *, jclass, jobjectArray, jint, jint, jstring);

#ifdef __cplusplus
}
#endif
#endif

M'n C++ methode ziet er als volgt uit:
C++:
1
2
3
4
5
6
#include "TrainerClass.h"
// Andere includes...

JNIEXPORT void JNICALL Java_TrainerClass_learn(JNIEnv *env, jclass jcl, jint object[][], jint width, jint length, jstring fileName) {
   //...
}

Als ik deze laatste file nu probeer te compileren, lukt dat niet. Hij zegt dat in Trainerclass.h (de bovenste) een syntax error optreedt voor void. Hij lijkt dus die JNIEXPORT niet te slikken :?
Vervolgens geeft hij ook nog eens dezelfde error (syntax error before void) in de implementatie van m'n method (het tweede stuk code dus).

Iemand enig idee wat ik fout doe :?

[ Voor 3% gewijzigd door Verwijderd op 19-11-2003 14:21 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Heb je al eens opgezocht waar JNIEXPORT gedefinieerd wordt? Want die error betekent gewoon "unknown keyword/type/function JNIEXPORT".

Je hebt neem ik aan ook al bij Google gezocht op dit probleem en de eerste 2 hits grondig doorgelezen?

[ Voor 45% gewijzigd door curry684 op 19-11-2003 14:11 ]

Professionele website nodig?


Verwijderd

Topicstarter
Normaal gesproken gebeurd dat in jni.h toch, en die wordt ook geinclude :?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 19 november 2003 @ 14:11:
Normaal gesporken gebeurd dat in jni.h toch, en die wordt ook geinclude :?
In hit 2 van de Google-link die ik gaf wordt aangegeven dat jni.h de compiler- en machinespecifieke macro JNIEXPORT definieert, en het is mogelijk dat TS de verkeerde vertalingen binnenkrijgt die zijn compiler niet slikt. In dat geval bestaat de macro dus wel maar kan de compiler het expanded result niet aan.

Professionele website nodig?


Verwijderd

Topicstarter
En wat kan ik hier dan aan doen? In die linkjes staat volgens mij geen oplossing voor mijn probleem...
Ik gebruik GCC 2.96 onder RedHat 7...

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Path instellen naar de locatie van de include ?

Wat niet kan is nog nooit gebeurd


Verwijderd

Topicstarter
Wat helpt dat? Alle includes doen het toch gewoon :?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Anders ga je gewoon eens alsnog die links lezen die ik geef over hoe je verbose include parsing aan kunt zetten, of lees je gewoon jni.h eens door om te zien waarom het fout gaat? :?

Professionele website nodig?


Verwijderd

Topicstarter
Het is opgelost. Ik compileer nu met de jni.h van de IBM VM, niet met de jni.h van GCC :)

code:
1
gcc -shared -I /opt/IBMJava2-14/include Trainer.cpp -o out.so

Verwijderd

Topicstarter
Het compileert nu allemaal wel, en ik heb de map waar m'n library staat toegevoegd aan het library path, maar nu krijg ik de volgende foutmelding:
code:
1
2
3
java.lang.UnsatisfiedLinkError: /students/groep2/TrainingTool/libTrainer.so: /students/groep2/TrainingTool/libTrainer.so: undefined symbol: __8ImageHSLG5Imageii
   at java.lang.ClassLoader$NativeLibrary.load(Native Method)
   at enz. enz.

Het enige wat ik in deze foutmelding herken zijn Image en ImageHSL, twee C++-classes die meegecompileerd zijn in libTrainer.so (ze zijn geinclude in Trainer.cpp, de C++-file met de native method)

Iemand een idee wat dit betekent :?
Pagina: 1