Jni et jarray [Résolu]

cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 12:01 - Dernière réponse : Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 15 juin 2006 à 16:14
3
Merci
Salut,


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

WORA

Merci Twinuts 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de Twinuts
HSylvio 116 Messages postés jeudi 22 juillet 2004Date d'inscription 14 juin 2012 Dernière intervention - 6 juin 2006 à 12:59
0
Merci
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;
Commenter la réponse de HSylvio
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 13:17
0
Merci
Si tu veux je peux poster le code que j'ai écrit.

kibab
Commenter la réponse de cs_kibab
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 14:16
0
Merci
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
Commenter la réponse de cs_kibab
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 6 juin 2006 à 15:30
0
Merci
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
Commenter la réponse de Twinuts
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 15:47
0
Merci
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
Commenter la réponse de cs_kibab
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 6 juin 2006 à 16:07
0
Merci
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
Commenter la réponse de Twinuts
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 16:24
0
Merci
Oui pour le 501 byte.

Le boucle ce celui de l`email precedant?
Commenter la réponse de cs_kibab
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 6 juin 2006 à 16:45
0
Merci
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
Commenter la réponse de Twinuts
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 16:55
0
Merci
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);
Commenter la réponse de cs_kibab
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 6 juin 2006 à 17:02
0
Merci
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
Commenter la réponse de Twinuts
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 6 juin 2006 à 17:13
0
Merci
En effet j'obtiens une liste d'erreurs sur prompt et tout s`arret. 

viPrintf fais partie de la librarie visa.h.
 
Commenter la réponse de cs_kibab
Twinuts 5272 Messages postés dimanche 4 mai 2003Date d'inscription 3 août 2018 Dernière intervention - 6 juin 2006 à 17:28
0
Merci
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
Commenter la réponse de Twinuts
cs_kibab 13 Messages postés jeudi 5 janvier 2006Date d'inscription 15 juin 2006 Dernière intervention - 15 juin 2006 à 10:47
0
Merci
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?
Commenter la réponse de cs_kibab

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.