PDA

View Full Version : richiamare libreria c++ tramite jni


cisc
15-05-2007, 14:41
ciao a tutti, ho qualche problemuccio col richiamare una libreria c++ da java, in pratica questa libreria fornisce un'api (metodi statici di una classe), e al momento della compilazione mi genera librerie statiche (per intenderci, files .a), io ho scritto la classe java, l'header nativo l'ho fatto generare da javah, e quindi ho implementato i metodi nativi che vanno a richiamare la classe, compilo con il seguente comando:


g++ -fPIC -I /usr/lib/java/include/ -I /usr/lib/java/include/linux/ -I /usr/local/include/tesseract/ -L/usr/local/lib/ -ltesseract_main -shared -o OcrApi.so it_dart_ocrapi_OcrApi.cpp


ma quando vado ad includere il .so in java, con il metodo System.load, mi esce un errore come se non riuscisse a linkare i metodi della libreria in C++..ora, so benissimo che per le libreria dinamiche basta includerle nel java.library.path o nella variabile d'ambiente LD_LIBRARY_PATH il percorso alle libreria..ma con le librerie statiche come devo comportarmi?:|

PGI-Bis
15-05-2007, 19:19
JNI non maneggia librerie statiche, nel senso che non puoi caricare una libreria statica con System.loadLibrary. Puoi caricare una libreria dinamica collegata ad una libreria statica. La soluzione di eventuali problemi che possono sorgere in questo passaggio spetta alla lingua nativa, al suo compilatore, eccetera.

cisc
15-05-2007, 22:14
JNI non maneggia librerie statiche, nel senso che non puoi caricare una libreria statica con System.loadLibrary. Puoi caricare una libreria dinamica collegata ad una libreria statica. La soluzione di eventuali problemi che possono sorgere in questo passaggio spetta alla lingua nativa, al suo compilatore, eccetera.

grazie per la risposta=) si, il mio problema è proprio che non riesco a linkare una libreria statica all'interno di una dinamica che poi carico con jni in java...

cisc
16-05-2007, 21:24
nessuno sa aiutarmi?

andbin
16-05-2007, 21:33
il mio problema è proprio che non riesco a linkare una libreria statica all'interno di una dinamicaChe libreria è?? Una libreria statica .a la puoi specificare per la fase di link mettendo nel comando -lnome o specificando proprio il nome completo (eventualmente di path) della libreria.

La differenza tra i due modi la spiega bene il 'man':
The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and .a and searches several directories.

cisc
16-05-2007, 23:31
Che libreria è?? Una libreria statica .a la puoi specificare per la fase di link mettendo nel comando -lnome o specificando proprio il nome completo (eventualmente di path) della libreria.

La differenza tra i due modi la spiega bene il 'man':
The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and .a and searches several directories.

allora, in pratica la libreria non è altro che il programma ocr tesseract, ultimamente hanno aggiunto anche una classe che fornisce diciamo l'API per poter usare tesseract da altri programmi, come potrai vedere dai parametri che passo a gcc per compilare, la libreria la includo, infatti compaiono le opzioni "-L/usr/local/lib/ -ltesseract_main", dove -L fa si che gcc vada a cercare nella cartella dove risiede la libreria,a e -ltesseract_main mi dovrebbe caricare il file libtesseract_main.a..il problema è che sembra che non lo faccia, dato che quando vado a caricare il .so risultante i java, un errore di undefined symbol, riferendosi poi chiaramente ad uno dei metodi dell'API.....ho provato cmq anche come dici tu, mettendo il nome completo..ma niente..

ilsensine
17-05-2007, 08:36
grazie per la risposta=) si, il mio problema è proprio che non riesco a linkare una libreria statica all'interno di una dinamica che poi carico con jni in java...
Fammi capire...vuoi convertire una libreria statica in una libreria dinamica?

cisc
17-05-2007, 10:43
Fammi capire...vuoi convertire una libreria statica in una libreria dinamica?

allora, in pratica io c'ho una lib statica, e ho fatto un wrapper diciamo, che devo usa la libreria statica, ma che deve essere caricata dinamicamente in java...non è proprio convertire la lib da statica a dinamica, dato che mi serve il wrapper che si interfacci con JNI.....

ilsensine
17-05-2007, 11:15
allora, in pratica io c'ho una lib statica, e ho fatto un wrapper diciamo, che devo usa la libreria statica, ma che deve essere caricata dinamicamente in java...non è proprio convertire la lib da statica a dinamica, dato che mi serve il wrapper che si interfacci con JNI.....
Non puoi caricare dinamicamente una libreria statica, ma puoi inglobarla in una libreria dinamicam come credo che stai cercando di fare. Devi solo stare attento ad alcune insidie, in quanto in fase di linking gli oggetti di un archivio .a vengono scartati se il linker non vede nessun utilizzatore.
Puoi riportare la tua completa riga di comando con cui fai il link finale?

cisc
17-05-2007, 11:59
Non puoi caricare dinamicamente una libreria statica, ma puoi inglobarla in una libreria dinamicam come credo che stai cercando di fare. Devi solo stare attento ad alcune insidie, in quanto in fase di linking gli oggetti di un archivio .a vengono scartati se il linker non vede nessun utilizzatore.
Puoi riportare la tua completa riga di comando con cui fai il link finale?

lancio solo questo

g++ -fPIC -I /usr/lib/java/include/ -I /usr/lib/java/include/linux/ -I /usr/local/include/tesseract/ -L/usr/local/lib/ -ltesseract_main -shared -o OcrApi.so it_dart_ocrapi_OcrApi.cpp

dove libtesseract_main.a è la lib statica da caricare.....

ilsensine
17-05-2007, 12:30
lancio solo questo

g++ -fPIC -I /usr/lib/java/include/ -I /usr/lib/java/include/linux/ -I /usr/local/include/tesseract/ -L/usr/local/lib/ -ltesseract_main -shared -o OcrApi.so it_dart_ocrapi_OcrApi.cpp

dove libtesseract_main.a è la lib statica da caricare.....
Chiappato 'o moscone...
-ltesseract_main deve seguire it_dart_ocrapi_OcrApi.cpp, altrimenti viene scartato dal linker. Un bel objdump -t può mostrartelo.
Nota inoltre che gli oggetti .o di tesseract_main che non vengono riferiti da it_dart_ocrapi_OcrApi.cpp, vengono anch'essi scartati. Se il file cpp è solo un wrapper per tesseract_main, probabilmente non è il tuo caso.

cisc
17-05-2007, 12:48
Chiappato 'o moscone...
-ltesseract_main deve seguire it_dart_ocrapi_OcrApi.cpp, altrimenti viene scartato dal linker. Un bel objdump -t può mostrartelo.
Nota inoltre che gli oggetti .o di tesseract_main che non vengono riferiti da it_dart_ocrapi_OcrApi.cpp, vengono anch'essi scartati. Se il file cpp è solo un wrapper per tesseract_main, probabilmente non è il tuo caso.

innanzitutto grazie mille! ho fatto come hai detto, e adesso l'undefined symbol ce l'ho per altra roba..ora.. il file cpp è wrapper per solo un .o che è contenuto un libtesseract_main.a, il quale ovviamente utilizza gli altri .o e altre librerie statiche.....magari provo ad aggiungerli tutti dopo con ld?...

ilsensine
17-05-2007, 12:59
innanzitutto grazie mille! ho fatto come hai detto, e adesso l'undefined symbol ce l'ho per altra roba..ora.. il file cpp è wrapper per solo un .o che è contenuto un libtesseract_main.a, il quale ovviamente utilizza gli altri .o e altre librerie statiche.....magari provo ad aggiungerli tutti dopo con ld?...
Sì certo. Fai in modo che il tuo .so abbia tutte le dipendenze che gli servono per essere caricato. Ricordati che se devi linkare gli .a l'ordine è importante: prima quelli che usano i successivi.
Sarà tutto ok quando riuscirai a fare un bel
LD_PRELOAD=<tuo so> cat /proc/self/maps
senza ottenere errori, e potendo vedere la tua libreria nell'elenco stampato.

cisc
20-05-2007, 11:36
ok, grazie a tutti, sono riuscito a richiamare sta cavolo di libreria da java, anche se, ilsensine, facendo un bel LD_PRELOAD=<tuo so> cat /proc/self/maps mi da cmq errore..ma tanto chis se ne frega, riesco a richiamarla in java:D...

cisc
24-05-2007, 11:30
ragazzi, dovrei realizzare una dll in modo da far funzionare il mio codice anche su win, considerando che la lib che sto usando supporta anche win, anzi, nell'ultima versione hanno prodotto loro stessi una dll...solo che ho esperienza zero su win...

nel readme c'è scritto questo:

=== Windows users only ===
Added a dll interface for windows. Thanks to Glen at Jetsoft for contributing
this. To use the dll, include tessdll.h, import tessdll.lib and put tessdll.dll
somewhere where the system can find it. There is also a small dlltest program
to test the dll. Run with:
dlltest phototest.tif phototest.txt
It will output the text from phototest.tif with bounding box information.
**New for Windows** the distribution now includes tesseract.exe and tessdll.dll
which *might* work out of the box! There are no guarantees as you need
VC++6 versions of mfc and crt (at least) for it to work. (Batteries not
included, and certainly no installshield.)


che significa che devo importare tessdll.lib? posso eventualmente seguire lo stesso procedimento usato per linux utilizzando cygwin? grazie mille

ilsensine
24-05-2007, 11:49
Puoi usare cygwin, a patto di usare gcc con l'opzione mingw. Oppure puoi installare msys+mingw. Non dovrebbe esserci bisogno del .lib; meglio ancora se compili tessdll con mingw.

Nota che ora dovresti veramente risolvere questo:
anche se, ilsensine, facendo un bel LD_PRELOAD=<tuo so> cat /proc/self/maps mi da cmq errore..ma tanto chis se ne frega, riesco a richiamarla in java :D
in quanto, a differenza dei .so, non puoi generare una dll con simboli non risolti.

cisc
24-05-2007, 17:42
grazie ancora, ma c'è un modo per capire per quale motivo da errore il preload della libreria?

ilsensine
25-05-2007, 08:45
Dovrebbe stamparti sulla console il motivo, ad es. quale è il simbolo non risolto.

cisc
25-05-2007, 11:46
Dovrebbe stamparti sulla console il motivo, ad es. quale è il simbolo non risolto.

strano, a me da solo un errore generico:|....adesso non sono dal mio pc, più tardi appena posso posto l'errore che mi da...

ilsensine
25-05-2007, 12:34
Poco male, quando farai la dll vedrai tutti gli errori di linking. Probabilmente devi linkare qualche libreria java.

cisc
25-05-2007, 16:37
ciao, allora la dll riesco a crearla con cygwin (usando lo stesso comando che uso su linux, e quindi caricando le lib di linux da cygwin) senza errori, ma poi, quando tento di caricarla in java, mi da l'errore di can't find dependent libraries...c'è un modo per verificare su windows la correttezza di una dll..e magari capire perchè non la carica in java? grazie.....

ilsensine
28-05-2007, 08:00
ciao, allora la dll riesco a crearla con cygwin (usando lo stesso comando che uso su linux, e quindi caricando le lib di linux da cygwin) senza errori, ma poi, quando tento di caricarla in java, mi da l'errore di can't find dependent libraries...c'è un modo per verificare su windows la correttezza di una dll..e magari capire perchè non la carica in java? grazie.....
Devi capire che dll manca e metterla in una directory accessibile (ad es. la cartella dell'eseguibile java o una cartella di sistema).
Sospetto che la dll cercata è cygwin.dll, il che vuol dire che non hai compilato tramite mingw e che non dovresti usare la dll così ottenuta.

cisc
31-05-2007, 15:01
rieccomi qua, allora, è stato prodotta una dll per windows del software ocr, correlato da file di progetto in vc++, quindi sono passato a vc++, riesco tranquillamente a ricompilare la dll e a farla funzioanare, quindi la modifica in modo da poterla richiamare da jni, la compilo senza errori, ma quando la richiamo in java...mi esce il seguente scarno messaggio come output:
"An unrecoverable stack overflow has occured"...ora, può essere che la memoria fornita alla dll sia limitata dalla virtual machine?

PGI-Bis
31-05-2007, 15:46
Prova a lanciare il programma con l'opzione -verbose:jni e vedi se stai abusando dello stack della JVM.

cisc
31-05-2007, 20:37
ecco cosa ho adesso come output:


[Dynamic-linking native method java.lang.Object.registerNatives ... JNI]
[Registering JNI native method java.lang.Object.hashCode]
[Registering JNI native method java.lang.Object.wait]
[Registering JNI native method java.lang.Object.notify]
[Registering JNI native method java.lang.Object.notifyAll]
[Registering JNI native method java.lang.Object.clone]
[Dynamic-linking native method java.lang.System.registerNatives ... JNI]
[Registering JNI native method java.lang.System.currentTimeMillis]
[Registering JNI native method java.lang.System.nanoTime]
[Registering JNI native method java.lang.System.arraycopy]
[Dynamic-linking native method java.lang.Thread.registerNatives ... JNI]
[Registering JNI native method java.lang.Thread.start0]
[Registering JNI native method java.lang.Thread.stop0]
[Registering JNI native method java.lang.Thread.isAlive]
[Registering JNI native method java.lang.Thread.suspend0]
[Registering JNI native method java.lang.Thread.resume0]
[Registering JNI native method java.lang.Thread.setPriority0]
[Registering JNI native method java.lang.Thread.yield]
[Registering JNI native method java.lang.Thread.sleep]
[Registering JNI native method java.lang.Thread.currentThread]
[Registering JNI native method java.lang.Thread.countStackFrames]
[Registering JNI native method java.lang.Thread.interrupt0]
[Registering JNI native method java.lang.Thread.isInterrupted]
[Registering JNI native method java.lang.Thread.holdsLock]
[Registering JNI native method java.lang.Thread.getThreads]
[Registering JNI native method java.lang.Thread.dumpThreads]
[Dynamic-linking native method java.lang.Class.registerNatives ... JNI]
[Registering JNI native method java.lang.Class.getName0]
[Registering JNI native method java.lang.Class.getSuperclass]
[Registering JNI native method java.lang.Class.getInterfaces]
[Registering JNI native method java.lang.Class.getClassLoader0]
[Registering JNI native method java.lang.Class.isInterface]
[Registering JNI native method java.lang.Class.getSigners]
[Registering JNI native method java.lang.Class.setSigners]
[Registering JNI native method java.lang.Class.isArray]
[Registering JNI native method java.lang.Class.isPrimitive]
[Registering JNI native method java.lang.Class.getComponentType]
[Registering JNI native method java.lang.Class.getModifiers]
[Registering JNI native method java.lang.Class.getDeclaredFields0]
[Registering JNI native method java.lang.Class.getDeclaredMethods0]
[Registering JNI native method java.lang.Class.getDeclaredConstructors0]
[Registering JNI native method java.lang.Class.getProtectionDomain0]
[Registering JNI native method java.lang.Class.setProtectionDomain0]
[Registering JNI native method java.lang.Class.getDeclaredClasses0]
[Registering JNI native method java.lang.Class.getDeclaringClass]
[Registering JNI native method java.lang.Class.getGenericSignature]
[Registering JNI native method java.lang.Class.getRawAnnotations]
[Registering JNI native method java.lang.Class.getConstantPool]
[Registering JNI native method java.lang.Class.desiredAssertionStatus0]
[Registering JNI native method java.lang.Class.getEnclosingMethod0]
[Dynamic-linking native method java.lang.Class.getPrimitiveClass ... JNI]
[Dynamic-linking native method java.security.AccessController.getStackAccessControlContext ... JNI]
[Dynamic-linking native method java.security.AccessController.getInheritedAccessControlContext ... JNI]
[Dynamic-linking native method java.lang.ClassLoader.registerNatives ... JNI]
[Registering JNI native method java.lang.ClassLoader.retrieveDirectives]
[Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI]
[Dynamic-linking native method java.lang.System.initProperties ... JNI]
[Dynamic-linking native method java.io.FileInputStream.initIDs ... JNI]
[Dynamic-linking native method java.io.FileDescriptor.initIDs ... JNI]
[Dynamic-linking native method java.io.FileDescriptor.set ... JNI]
[Dynamic-linking native method java.io.FileOutputStream.initIDs ... JNI]
[Dynamic-linking native method sun.misc.Unsafe.registerNatives ... JNI]
[Registering JNI native method sun.misc.Unsafe.getLoadAverage]
[Dynamic-linking native method java.lang.Throwable.fillInStackTrace ... JNI]
[Registering JNI native method sun.misc.Unsafe.getObject]
[Registering JNI native method sun.misc.Unsafe.putObject]
[Registering JNI native method sun.misc.Unsafe.getObjectVolatile]
[Registering JNI native method sun.misc.Unsafe.putObjectVolatile]
[Registering JNI native method sun.misc.Unsafe.getBoolean]
[Registering JNI native method sun.misc.Unsafe.putBoolean]
[Registering JNI native method sun.misc.Unsafe.getBooleanVolatile]
[Registering JNI native method sun.misc.Unsafe.putBooleanVolatile]
[Registering JNI native method sun.misc.Unsafe.getByte]
[Registering JNI native method sun.misc.Unsafe.putByte]
[Registering JNI native method sun.misc.Unsafe.getByteVolatile]
[Registering JNI native method sun.misc.Unsafe.putByteVolatile]
[Registering JNI native method sun.misc.Unsafe.getShort]
[Registering JNI native method sun.misc.Unsafe.putShort]
[Registering JNI native method sun.misc.Unsafe.getShortVolatile]
[Registering JNI native method sun.misc.Unsafe.putShortVolatile]
[Registering JNI native method sun.misc.Unsafe.getChar]
[Registering JNI native method sun.misc.Unsafe.putChar]
[Registering JNI native method sun.misc.Unsafe.getCharVolatile]
[Registering JNI native method sun.misc.Unsafe.putCharVolatile]
[Registering JNI native method sun.misc.Unsafe.getInt]
[Registering JNI native method sun.misc.Unsafe.putInt]
[Registering JNI native method sun.misc.Unsafe.getIntVolatile]
[Registering JNI native method sun.misc.Unsafe.putIntVolatile]
[Registering JNI native method sun.misc.Unsafe.getLong]
[Registering JNI native method sun.misc.Unsafe.putLong]
[Registering JNI native method sun.misc.Unsafe.getLongVolatile]
[Registering JNI native method sun.misc.Unsafe.putLongVolatile]
[Registering JNI native method sun.misc.Unsafe.getFloat]
[Registering JNI native method sun.misc.Unsafe.putFloat]
[Registering JNI native method sun.misc.Unsafe.getFloatVolatile]
[Registering JNI native method sun.misc.Unsafe.putFloatVolatile]
[Registering JNI native method sun.misc.Unsafe.getDouble]
[Registering JNI native method sun.misc.Unsafe.putDouble]
[Registering JNI native method sun.misc.Unsafe.getDoubleVolatile]
[Registering JNI native method sun.misc.Unsafe.putDoubleVolatile]
[Registering JNI native method sun.misc.Unsafe.getByte]
[Registering JNI native method sun.misc.Unsafe.putByte]
[Registering JNI native method sun.misc.Unsafe.getShort]
[Registering JNI native method sun.misc.Unsafe.putShort]
[Registering JNI native method sun.misc.Unsafe.getChar]
[Registering JNI native method sun.misc.Unsafe.putChar]
[Registering JNI native method sun.misc.Unsafe.getInt]
[Registering JNI native method sun.misc.Unsafe.putInt]
[Registering JNI native method sun.misc.Unsafe.getLong]
[Registering JNI native method sun.misc.Unsafe.putLong]
[Registering JNI native method sun.misc.Unsafe.getFloat]
[Registering JNI native method sun.misc.Unsafe.putFloat]
[Registering JNI native method sun.misc.Unsafe.getDouble]
[Registering JNI native method sun.misc.Unsafe.putDouble]
[Registering JNI native method sun.misc.Unsafe.getAddress]
[Registering JNI native method sun.misc.Unsafe.putAddress]
[Registering JNI native method sun.misc.Unsafe.allocateMemory]
[Registering JNI native method sun.misc.Unsafe.reallocateMemory]
[Registering JNI native method sun.misc.Unsafe.setMemory]
[Registering JNI native method sun.misc.Unsafe.copyMemory]
[Registering JNI native method sun.misc.Unsafe.freeMemory]
[Registering JNI native method sun.misc.Unsafe.objectFieldOffset]
[Registering JNI native method sun.misc.Unsafe.staticFieldOffset]
[Registering JNI native method sun.misc.Unsafe.staticFieldBase]
[Registering JNI native method sun.misc.Unsafe.ensureClassInitialized]
[Registering JNI native method sun.misc.Unsafe.arrayBaseOffset]
[Registering JNI native method sun.misc.Unsafe.arrayIndexScale]
[Registering JNI native method sun.misc.Unsafe.addressSize]
[Registering JNI native method sun.misc.Unsafe.pageSize]
[Registering JNI native method sun.misc.Unsafe.defineClass]
[Registering JNI native method sun.misc.Unsafe.defineClass]
[Registering JNI native method sun.misc.Unsafe.allocateInstance]
[Registering JNI native method sun.misc.Unsafe.monitorEnter]
[Registering JNI native method sun.misc.Unsafe.monitorExit]
[Registering JNI native method sun.misc.Unsafe.tryMonitorEnter]
[Registering JNI native method sun.misc.Unsafe.throwException]
[Registering JNI native method sun.misc.Unsafe.compareAndSwapObject]
[Registering JNI native method sun.misc.Unsafe.compareAndSwapInt]
[Registering JNI native method sun.misc.Unsafe.compareAndSwapLong]
[Registering JNI native method sun.misc.Unsafe.putOrderedObject]
[Registering JNI native method sun.misc.Unsafe.putOrderedInt]
[Registering JNI native method sun.misc.Unsafe.putOrderedLong]
[Registering JNI native method sun.misc.Unsafe.park]
[Registering JNI native method sun.misc.Unsafe.unpark]
[Dynamic-linking native method sun.reflect.Reflection.getCallerClass ... JNI]
[Dynamic-linking native method java.lang.String.intern ... JNI]
[Dynamic-linking native method java.lang.System.setIn0 ... JNI]
[Dynamic-linking native method java.lang.Float.floatToRawIntBits ... JNI]
[Dynamic-linking native method java.lang.Double.doubleToRawLongBits ... JNI]
[Dynamic-linking native method java.lang.Object.getClass ... JNI]
[Dynamic-linking native method java.lang.Class.forName0 ... JNI]
[Dynamic-linking native method sun.reflect.Reflection.getClassAccessFlags ... JNI]
[Dynamic-linking native method sun.reflect.NativeConstructorAccessorImpl.newInstance0 ... JNI]
[Dynamic-linking native method sun.misc.VM.initialize ... JNI]
[Dynamic-linking native method java.lang.Runtime.maxMemory ... JNI]
[Dynamic-linking native method java.lang.System.setOut0 ... JNI]
[Dynamic-linking native method java.lang.System.setErr0 ... JNI]
[Dynamic-linking native method java.io.FileSystem.getFileSystem ... JNI]
[Dynamic-linking native method java.io.Win32FileSystem.initIDs ... JNI]
[Dynamic-linking native method java.io.WinNTFileSystem.initIDs ... JNI]
[Dynamic-linking native method java.lang.System.mapLibraryName ... JNI]
[Dynamic-linking native method java.io.WinNTFileSystem.getBooleanAttributes ... JNI]
[Dynamic-linking native method java.io.WinNTFileSystem.canonicalize0 ... JNI]
[Dynamic-linking native method java.lang.ClassLoader$NativeLibrary.load ... JNI]
[Dynamic-linking native method sun.misc.Signal.findSignal ... JNI]
[Dynamic-linking native method sun.misc.Signal.handle0 ... JNI]
[Dynamic-linking native method sun.io.Win32ErrorMode.setErrorMode ... JNI]
[Dynamic-linking native method java.lang.Compiler.registerNatives ... JNI]
[Registering JNI native method java.lang.Compiler.compileClass]
[Registering JNI native method java.lang.Compiler.compileClasses]
[Registering JNI native method java.lang.Compiler.command]
[Registering JNI native method java.lang.Compiler.enable]
[Registering JNI native method java.lang.Compiler.disable]
[Dynamic-linking native method java.lang.ClassLoader$NativeLibrary.find ... JNI]
[Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI]
[Dynamic-linking native method java.io.FileInputStream.open ... JNI]
[Dynamic-linking native method java.io.FileInputStream.readBytes ... JNI]
[Dynamic-linking native method java.io.FileInputStream.available ... JNI]
[Dynamic-linking native method java.lang.reflect.Array.newArray ... JNI]
[Dynamic-linking native method java.io.ObjectStreamClass.initNative ... JNI]
[Dynamic-linking native method java.io.FileInputStream.close0 ... JNI]
[Dynamic-linking native method java.io.WinNTFileSystem.list ... JNI]
[Dynamic-linking native method java.io.WinNTFileSystem.canonicalizeWithPrefix0 ... JNI]
[Dynamic-linking native method java.lang.ClassLoader.findLoadedClass0 ... JNI]
[Dynamic-linking native method java.lang.ClassLoader.findBootstrapClass ... JNI]
[Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI]
[Dynamic-linking native method java.lang.Package.getSystemPackage0 ... JNI]
[Dynamic-linking native method java.io.WinNTFileSystem.getLength ... JNI]
[Dynamic-linking native method java.lang.ClassLoader.defineClass1 ... JNI]
[Dynamic-linking native method it.dart.ocrapi.TesseractApi.recognizeImage ... JNI]
An unrecoverable stack overflow has occurred.

PGI-Bis
31-05-2007, 21:26
Perfetto: non è servito a niente :D.

ilsensine
01-06-2007, 08:55
"An unrecoverable stack overflow has occured"...ora, può essere che la memoria fornita alla dll sia limitata dalla virtual machine?
Non credo sia un problema di memoria. Visto che l'errore è stato rilevato sullo stack, mi vengono in mente due possibili cause:
1) un genuino stack overflow
2) calling convention mismatch

Propenderei per la seconda ipotesi. Mentre su linux praticamente tutte le librerie adottano lo standard di chiamata "c", su windows si usa spesso lo "stdcall", specie per le funzioni di "interfaccia".
La differenza tra le due forme è chi "ripulisce" lo stack dai parametri passati alle funzioni: nella forma "c" è il chiamante a ripulire lo stack; nella forma stdcall è la stessa funzione chiamata.
Nota che anche il visual basic ha una simile forma di controllo: otterresti un errore di "invalid calling convention" se richiami da visual basic una funzione di una dll che non sia stata dichiarata come "stdcall".

cisc
01-06-2007, 15:06
Non credo sia un problema di memoria. Visto che l'errore è stato rilevato sullo stack, mi vengono in mente due possibili cause:
1) un genuino stack overflow
2) calling convention mismatch

Propenderei per la seconda ipotesi. Mentre su linux praticamente tutte le librerie adottano lo standard di chiamata "c", su windows si usa spesso lo "stdcall", specie per le funzioni di "interfaccia".
La differenza tra le due forme è chi "ripulisce" lo stack dai parametri passati alle funzioni: nella forma "c" è il chiamante a ripulire lo stack; nella forma stdcall è la stessa funzione chiamata.
Nota che anche il visual basic ha una simile forma di controllo: otterresti un errore di "invalid calling convention" se richiami da visual basic una funzione di una dll che non sia stata dichiarata come "stdcall".


allora, la funzione "pubblica" della dll è compilata come __stdcall, il problema è tutto il resto del programma che la dll utilizza? dovrei compilare tutte le funzioni con l'opzione stdcall? come è possibile farlo da vc++ senza modificare il codice?

cisc
01-06-2007, 15:19
ho messo l'opzione /Gz per compilare tutto come stdcall, se non è specificato nel codice..ma ottengo sempre lo stesso errore..

cisc
01-06-2007, 16:06
ragazzi, ed invece il problema era la jvm, aggiungendo l'opzione "-Xss512k" adesso funziona perfettamente!!:D