Jni et jarray

Résolu
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006 - 6 juin 2006 à 12:01
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 - 15 juin 2006 à 16:14
Bounjour a vous tous

Imaginées qu'un oracle me donne 501 int, comme fais à les insérer dans une array et les imprimer à écran ?

Svp aidez moi, mon code ne fonctionne pas.

Excusées la question stupide mais je suis aux premières expériences.

Merci a vous tous

kibab

14 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
15 juin 2006 à 16:14
Salut,


tu es sur le mauvais forum ici on ne parle pas vb

WORA
3
HSylvio Messages postés 116 Date d'inscription jeudi 22 juillet 2004 Statut Membre Dernière intervention 14 juin 2012
6 juin 2006 à 12:59
T'inkièt c un peu la galere au debut les JNI jtrouve... c elle stupide oui!!

Sinon ben un peu de ton code aurait été bienvenu paske là ca va pas etre facile de t'aider vraiment; sauf te donner un tutoriel mais ca sert a rien jpense...

Sinon je pense que tu as bien:
une dll de ta partie Oracle?!?
JNIEXPORT jintArray JNICALL Java_TestJNI1_MAFONCTION(JNIEnv *env, jobject obj, (???)argsFromJava,...)
un ".def" où tes fonctions interfacees st decrites ( EXPORTS
Java_TestJNI1_MAFONCTION)
que tu compiles bien tout...

Enfin voila envoies un peu du code;
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
6 juin 2006 à 13:17
Si tu veux je peux poster le code que j'ai écrit.

kibab
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
6 juin 2006 à 14:16
JNIEXPORT jobjectArray JNICALL Java_LineChart_importT
  (JNIEnv *env, jclass cls, jint size)

          jobjectArray result;
          int unsigned i;
          jclass byteArrCls = (*env)->FindClass(env,"[B");
          if (byteArrCls == NULL) {
                          return NULL;
                          }
         
          result = (*env)->NewObjectArray(env, size, byteArrCls, NULL);
          if (result==NULL) {
                            return NULL;
          }
         
          for (i=0; i < size; i++) {
              jbyte tmp[500]={0};
              unsigned long actual;

               /*ca ce l'oracle*/
              viPrintf (vi, "FORM REAL;TRAC:DATA? TRACE1 %s\n", tmp);
          viScanf(vi, "%t", tmp);
            /*ca ce l'oracle*/

              int unsigned j;
              jbyteArray barr = (*env)->NewByteArray(env, actual);
              if (barr == NULL) {
                       return NULL;
              }
             
        /* for (j=0; j<size; j++) {
              tmp[j]=tmp;
              tmp+1;
          }*/
         
          (*env)->SetByteArrayRegion(env,barr,0,size,tmp);
          (*env)->SetObjectArrayElement(env, result, i, barr);
          }
          printf("Finale :", result);
          return result;
}

Merci de m'aidez

kibab
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 juin 2006 à 15:30
Salut,



Pourquoi tu fais :

jclass byteArrCls = (*env)->FindClass(env,"[B");

if (byteArrCls == NULL) return NULL;

result = (*env)->NewObjectArray(env, size, byteArrCls, NULL);

if (result==NULL)  return NULL;


et non

jbyteArray jb;

jb = (*env)->NewByteArray(env, size);


donne l'endroit ou toper la doc de viPrintf et viScanf si tu veux plus d'aide

WORA
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
6 juin 2006 à 15:47
Je ne sais pas t'aider pour ca. Mais je sais que si tu veux communiquer avec un instrument électronique tu doit utiliser une spéciale librairie.

par example:

JNIEXPORT jstring JNICALL Java_readX
  (JNIEnv *env, jobject obj)
{
          char num[20]= {0};
 
          viPrintf (vi, "X? \n", num);
          viScanf(vi, "%t", num);
          return (*env)->NewStringUTF(env,num);             
}

viPrintf (vi, "X? \n", num);
viScanf(vi, "%t", num);
Avec ceci j'obtiens un numero dans le format string (X en question) e après je le convert pour l'utiliser en java.

Maintenant imaginez que avec ca
viPrintf (vi, "FORM REAL;TRAC:DATA? TRACE1 %s\n", tmp);
viScanf(vi, "%t", tmp);
j'obtiens 501 byte, comment je fais pour le mettre dans un bytearray e l'imprimer à écran?

Merci pour votre disponibilité

kibab
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 juin 2006 à 16:07
oki donc

viPrintf (vi, "FORM REAL;TRAC:DATA? TRACE1 %s\n", tmp);

viScanf(vi, "%t", tmp);


te renvoi les 501 byte d'un coups? si c'est le cas tu peux deja
commencer par epurer ton code en enlevant la boucle for qui ne te sert
pas a grand chose

WORA
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
6 juin 2006 à 16:24
Oui pour le 501 byte.

Le boucle ce celui de l`email precedant?
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 juin 2006 à 16:45
ja parle de cette boucle

for (i=0; i < size; i++){

            jbyte tmp[500]={0};

              unsigned long actual;


               /*ca ce l'oracle*/

             
viPrintf (vi, "FORM REAL;TRAC:DATA? TRACE1 %s\n", tmp);

          viScanf(vi, "%t", tmp);

            /*ca ce l'oracle*/


              int unsigned j;

             
jbyteArray barr = (*env)->NewByteArray(env, actual);

              if (barr == NULL) {

                      
return NULL;

              }

             

        /* for (j=0; j<size; j++) {

              tmp[j]=tmp;

              tmp+1;

          }*/

         

          (*env)->SetByteArrayRegion(env,barr,0,size,tmp);

          (*env)->SetObjectArrayElement(env, result, i, barr);
}

WORA
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
6 juin 2006 à 16:55
et j` escrit ca?

jbyteArray jb;
viPrintf (vi, "FORM REAL;TRAC:DATA? TRACE1 \n", jb);
viScanf(vi, "%t", jb);
printf(jb);
return (*env)->NewByteArray(env, jb);
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 juin 2006 à 17:02
Lol nan, sinon tu risque de te taper un belle erreur vu que jb vaut tous sauf une reference valide


pour te repondre desuite et eviter de perdre du temps pour rien il me
faudrai la signature de la methode viPrintf pour savoir si on peux
faire le code ci-dessous ou non (perso je suis presque sur que non


jbyteArray jb;

(*env)->NewByteArray(env, jb);


viPrintf (vi, "FORM REAL;TRAC:DATA? TRACE1 \n", jb);

viScanf(vi, "%t", jb);


printf(jb);//ca va pas t'afficher gd chose

return jb;


pour afficher le contenu du tableau en byte faut faire une boucle et
utiliser les fonctions de récupération d'element dans un tableau
fournit par JNIEnv

WORA
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
6 juin 2006 à 17:13
En effet j'obtiens une liste d'erreurs sur prompt et tout s`arret. 

viPrintf fais partie de la librarie visa.h.
 
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 juin 2006 à 17:28
Ba il va te falloir prendre sur toi et faire un copier/coller du prototype de la fonction viPrintf situé dans le fichier visa.h(je ne suis toujours pas devin).


de plus kesako ta variable vi ?

WORA
0
cs_kibab Messages postés 13 Date d'inscription jeudi 5 janvier 2006 Statut Membre Dernière intervention 15 juin 2006
15 juin 2006 à 10:47
Bonjour a tous

J'ai eté un petit en avant mais j'ai des problèmes. En ne réussissant pas à débloquer la situation dans C je me suis mis avec VB et ai résolu le problème. Quelqu'un m'aiderait à traduire le suivant code dans C:
Private Sub Main()

' Declare Variables used in the program

Dim status As Long 'VISA function status return code

Dim defrm As Long 'Session to Default Resource Manager

Dim vi As Long 'Session to instrument

Dim strRes As String * 100 'Fixed length string to hold *IDN? Results

Dim x As Integer 'Loop Variable

Dim output As String 'output string variable

Dim ArrayPtr(1) As Long 'Array of Pointers

Dim ResultsArray(2500) As Single 'trace element array of Real,32 values

'For Real,64 data use Double. For Int,32 data use Long

Dim length As Long 'Number of trace elements return from instrument

Dim fnum As Integer 'File Number to used to open file to store data

Dim isOpen As Boolean 'Boolean flag used to keep track of open file

'Set the default number of trace elements to the ResultsArray size

length = 2500

'Set the array of pointers to the addresses of the variables

ArrayPtr(0) = VarPtr(length)

ArrayPtr(1) = VarPtr(ResultsArray(0))

On Error GoTo Error_Handler

' Open the default resource manager session

status = viOpenDefaultRM(defrm)

' Open the session. Note: For PSA, to use LAN, change the string to

' "TCPIP0::xxx.xxx.xxx.xxx::inst0::INTSR" where xxxxx is the IP address

status = viOpen(defrm, "", 0, 0, vi)

If (status < 0) Then GoTo VisaErrorHandler

'Ask for the devices's *IDN string.

status = viVPrintf(vi, "*IDN?" + Chr$(10), 0)

If (status < 0) Then GoTo VisaErrorHandler

'Read back the IDN string from the instrument

status = viVScanf(vi, "%t", strRes)

If (status < 0) Then GoTo VisaErrorHandler

'Print the IDN string results in a message box

MsgBox (strRes)

' Set instrument trace data format to 32-bit Real

' Note: For higher precision use 64-bit data, ":FORM REAL,64"

' For faster data transfer for ESA, use ":FORM INT,32"

status = viVPrintf(vi, ":FORM REAL,32" + Chr$(10), 0)

If (status < 0) Then GoTo VisaErrorHandler

'Set Analyzer to single sweep mode

status = viVPrintf(vi, ":INIT:CONT 0" + Chr$(10), 0)

If (status < 0) Then GoTo VisaErrorHandler

'Query the trace data from the instrument

'Note: Change the "%#zb" to "%#Zb" for Real,64 data

' For Int,32 leave the modifier as "%#zb"

status = viVQueryf(vi, ":TRAC:DATA? TRACE1" + Chr$(10), _

"%#zb", ArrayPtr(0))

'Close the vi session and the resource manager session

Call viClose(vi)

Call viClose(defrm)

'Print number of elements returned

MsgBox ("Number of trace elements returned = " &amp; length)

'Create a string from the ResultsArray to output to a file

For x = 0 To length - 1

output = output &amp; ResultsArray(x) &amp; vbCrLf

Next x

'Print Results to the Screen

MsgBox (output)

'Store the results in a text file

fnum = FreeFile() 'Get the next free file number

Open "bintrace.txt" For Output As #fnum

isOpen = True

Print #fnum, output

' Intentionally flow into Error Handler to close file

Error_Handler:

' Raise the error (if any), but first close the file

If isOpen Then Close #fnum

If Err Then Err.Raise Err.Number, , Err.Description

Exit Sub

VisaErrorHandler:

Dim strVisaErr As String * 200

Call viStatusDesc(defrm, status, strVisaErr)

MsgBox "*** Error : " &amp; strVisaErr, vbExclamation, "VISA Error Message"

Exit Sub

End Sub

S'il vous plait, aidez moi. Je suis bloque

kibab Merci, merci beaucoup

ps comment je fais, si on peut, ajouter un ficher?
0
Rejoignez-nous