HSylvio
Messages postés116Date d'inscriptionjeudi 22 juillet 2004StatutMembreDernière intervention14 juin 2012
-
30 juin 2006 à 10:51
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023
-
20 juil. 2006 à 17:31
Bonjour,
J'utilise une interface native pour lancer un algorithme en C++ depuis java :
public native String construitZero(double []a);
Le probleme c'est une erreur, qui n'apparaît pas forcémant au même moment d'une execution à l'autre!!!
En effet je pensais avoir une grosse erreur dans mon code CPP mais ce message :
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c94426d, pid=1800, tid=2524
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_06-b05 mixed mode)
# Problematic frame:
# C [ntdll.dll+0x3426d]
#
# An error report file with more information is saved as hs_err_pid1800.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp #
HSylvio
Messages postés116Date d'inscriptionjeudi 22 juillet 2004StatutMembreDernière intervention14 juin 2012 30 juin 2006 à 11:36
OK :
Classe testJNI1 :
static {
System.loadLibrary("Project1");
System.out.println("Bib lue\n");
}
public native String construitZero(double []a);
ActionListener :
if(null!=paramC){
System.out.println("LANCEMENT DE L'ALGO ");
System.out.println(construitZero(paramC));
}else
System.out.println("On peut pas lancer l'algo : tableau de parametres vide!");
}
/* Récupération des informations JAVA : */
cout << "On a recu ";
int arrayLength = env->GetArrayLength(argsFromJava);
cout << arrayLength << " elements : " << endl;
t = env->GetDoubleArrayElements(argsFromJava, 0);
[ ... on rempli des tableaux avec ce qu'il y a dans t ]
rec reC; // une classe CPP
int monA = 82;
bool creation = reC.init(monA);
cerr<<"initialisé"<<endl;
reC.setProp(tabLength, tab10, tab11, "arg1");
reC.setProp(tabLength, tab20, tab21, "arg2");
cerr<<"Fns mémorisées"<<endl;
reC.setPM(d); // ca plante ici desfois (=> void rec::setPM(double p){ PM = p; }
cout<<"D mis à "<<d<<endl;
reC.fitD(); // desfois ca plante pdt cette fn
int randz = rand()%monA;
for(int i=0;i<monA;i++){
for(int j=0;j<monA;j++){
// on affiche un resultat de reC
}
cout<<endl;
}
reC.calculResultat(); // d'autres fois ca plante ici
cin>>new char;
return env->NewStringUTF(" Allez, au revoir"); // et ca a meme deja plante là, juste apres dire au revoir...
}
Voila donc un peu du code abrege; j'ai 'pas le droit' de le donner vraiment...
si vous en voulez plus je modifierai un peu d'autres classes pour vs en donner l'aperçu...
Sinon j'ai esaye de faire de testJNI1 un thread, une classe statique, un singleton et c'est toujours pareil, ca plante à des endroits differents chaque lancer... c'est pour ca ke je vous met pas d'output...
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 30 juin 2006 à 12:07
Salut,
avec le peut d'info que tu donne il est pas possible de te depanner....
c'est quoi "t", "d"
que fait reC.init(monA), reC.setProp(tabLength, tab10, tab11, "arg1"),
reC.setProp(tabLength, tab20, tab21, "arg2"), reC.fitD(),
reC.calculResultat()
return env->NewStringUTF(" Allez, au revoir")// pa beau
creer c'est fonction et appel la dans ton code apres chaque
manipulation jni comme ca tu aura un peut plus d'info (mais pour moi tu
nous fait une jolie erreur de segmentation)
void printStackTrace(JNIEnv *e){
if(e->ExceptionOccurred()){
e->ExceptionDescribe();
e->ExceptionClear();
}
}
a ui meme si il est gros colle le contenu du rapport de la jvm soit le fichier hs_err_pid1800.log
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
Other Threads:
0x00a7b408 VMThread [id=1120]
0x00aa65e0 WatcherThread [id=3744]
VM state:not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
Heap
def new generation total 11072K, used 6169K [0x02ad0000, 0x036d0000, 0x05140000)
eden space 9856K, 62% used [0x02ad0000, 0x030d6578, 0x03470000)
from space 1216K, 0% used [0x03470000, 0x03470000, 0x035a0000)
to space 1216K, 0% used [0x035a0000, 0x035a0000, 0x036d0000)
tenured generation total 147456K, used 0K [0x05140000, 0x0e140000, 0x21ed0000)
the space 147456K, 0% used [0x05140000, 0x05140000, 0x05140200, 0x0e140000)
compacting perm gen total 8192K, used 6414K [0x21ed0000, 0x226d0000, 0x25ed0000)
the space 8192K, 78% used [0x21ed0000, 0x225139a0, 0x22513a00, 0x226d0000)
No shared spaces configured.
Puis un ou deux outputs différents avant plantage ou coupure du prog. :
1)
DEBUT calcul des propriÚtÚs du cube reconstruit
creation : 41 CrÚation de resultatCorrel
done
dbt boucle readData
// plus de reponse du prog pendant ..........
2)
DEBUT calcul des propriÚtÚs du cube reconstruit
creation : 372CrÚation de resultatCorrel
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c921639, pid=3904, tid=2476
# bla bla bla
=>
DEBUT calcul des propriÚtÚs du cube reconstruit
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x7c93ae22, pid=2712, tid=1252
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_06-b05 mixed mode)
# Problematic frame:
# C [ntdll.dll+0x2ae22]
#
# An error report file with more information is saved as hs_err_pid2712.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp #
Autres infos : t c'est un tablea de doubles, d c'est un double calculable selon t.
Sinon séparer toutes les fns et mettre mon main en java serait possible mais je pensais que les valeurs seraient effacees entre 2 appels de fn; et puis j'en vois pas vraiment l'avantage sauf oui pour debugger un peu ptetr...
le truc c que je cree un bool[2k][2k][2k] (theCube) en C et les fns travaillent dessus
apres cubeCL c'est des propriétés du cube dans son etat actuel.
Voila n'hesitez pas a poser des questions parce que là je commence a serrer avec certte histoire de JNI;
j'vais faire 2 prog differents et ptetr que ca marchera mieux!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 30 juin 2006 à 21:02
Salut,
bon c'est juste pour t'aiguiller vu que je ne sais pas vraiment le pourquoi du comment de ce que tu fais, je t'ai fais deux trois manipulations possible avec les doubles java, donc voilou pour info je suis avec le jdk1.5 et sous linux bien que je reste sous la norme ANSI niveau cpp donc normalement ca devrait fonctionner sous windows (oublie pas LD_LIBRARY_PATH) .
ui je le dis dans un des 3 commentaire (:P) ne modifie pas une variable java passée en paramètres
fichier java contenant les methodes native :
package org.cs.java.test;
public class TestDoubleJNI {
static{
System.loadLibrary("DoubleJNI");
}
public TestDoubleJNI(){
init();//init de l'objet
}
public native double construitZero(double []a);
public native String toString();
private native void init();//init de l'objet
public native void destroy();//destruction de l'objet
}
----------------------------------------
main java
jdouble JNIDouble::makeZero(jdoubleArray jda){
double addDouble = 0.0;
jboolean isCopy = JNI_FALSE;
jdouble* doubleArrayElements = env->GetDoubleArrayElements(jda, &isCopy);
arrayLength = env->GetArrayLength(jda);
cdouble = new double [arrayLength];
for (unsigned int i = 0; i < arrayLength; i++) addDouble +(cdouble[i] doubleArrayElements[i]);//copie des elements du tableau java dans un tableau C++
if (isCopy == JNI_TRUE)//si la copie est good
env -> ReleaseDoubleArrayElements(jda, cdouble, JNI_ABORT);//on relache les ressources du tableau java
return addDouble;
}
jstring JNIDouble::toString(){
string cstr = "Nombre d'elements du tableau de double (java) : ";
// creer un flux de sortie
ostringstream oss;
// ecrit la taille dans le flux
oss << arrayLength;
// recupere la chaine et l'ajoute au string courrant
cstr.append(oss.str());
cstr.append("\nelements du tableau [");
for(unsigned int i = 0; i < arrayLength; i++){
oss << cdouble[i];//conversion du double courrant
cstr.append(oss.str());//ajout de ce double
if(i < (arrayLength-1)) cstr.append(", ");//juste pour la lisibilitee
}
cstr.append("].");//pour le fun
return env->NewStringUTF(cstr.c_str());//on retourne la chaine
}
}
}
}
}
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
foulla002
Messages postés47Date d'inscriptionmardi 4 juillet 2006StatutMembreDernière intervention 5 septembre 2006 20 juil. 2006 à 17:20
j'ai un probleme
package apii;
import com.ice.jni.*;
//import com.ms.dll.*;
public class TestWinAPI {
public static void main (String[] args) {
// Give us some room,
// let's say 128 characters (MAX 127 + '\0').
long[] buffer = { 128 } ;
/** @dll.import("ADVAPI32") */
static native void GetUserNameA
(StringBuffer userName, long buffer[]);
// string by ref are passed with a StringBuffer
// basic scalar type by ref are passed via an array
}
///////////////////////////////////
voici mon fichier .h genere avec javah -jni
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class apii_TestWinAPI */
#ifdef __cplusplus
}
#endif
#endif
///////////////////////////////////
je ne sais rien faire de plus sachant que qd je compile avec jbuilder je trouve
/////////////////////////////////////////
java.lang.UnsatisfiedLinkError: GetUserNameA
at apii.TestWinAPI.GetUserNameA(Native Method)
at apii.TestWinAPI.main(TestWinAPI.java:18)
Exception in thread "main"
qu'est ce que je fais d'autre pour terminer et comment corriger l'erreur c'est urgent merci