Читать бинарный файл в C и перемещать это из-за JNI в java

Привет программа, которая у меня есть, функционирует, но я занимаю знание, как он состоит в том, что C он может читать бинарные файлы, предположительно я, который с rb является чтением бинарных файлов, но в части C, создается NewStringUTF, который способствует тому, чтобы, когда ты прочитаешь какие-то символы особенно, он не послал их в Java, как он мог способствовать тому, чтобы C он прочитал любой tipode, храню в архиве, и что переместил все байт, было каковым будьте Ваше кодирование

Java

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class ReadFileJNI
{
native String[] readfile();
static
{
 System.loadLibrary("ReadFileJNI");
}
static public void main(String args[])
{
//SE CREA UN OBJETO DE LECTURA QUE TENDRÁ COMUNICACIÓN CON "C"
ReadFileJNI obj = new ReadFileJNI();
//SE CREA UN ARREGLO PARA LA LECTURA DE DATOS
String[] buffer = obj.readfile();
System.out.println(" El arreglo desde C es: \n ");
//SE ASIGNA EL ARREGLO A UNA CADENA
for(String name: buffer)
//SE IMPRIME EN PANTALLA LOS DATOS OBTENIDOS DESDE "C"
    System.out.println(name);
   try {
            //ESPECIFICAMOS LA RUTA DONDE SE CREARA EL ARCHIVO DONDE SE COPIARAN LOS DATOS
            File file = new File("D:\\Users\\earias\\Desktop\\pruebas  251016\\ReadFileJNI\\datos2.txt");
            //SI EL ARCHIVO NO EXISTE ENTONCES LO CREA
            if (!file.exists()) {
                file.createNewFile();
            }
            //LLAMAMOS LA FUNCIÓN QUE ESCRIBIRÁ LOS DATOS EN EL  NUEVO  ARCHIVO
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            //ESCRIBIMOS LOS DATOS EN EL ARCHIVO
            for(String name: buffer){
                    bw.write(name);
            }
            //CERRAMOS EL BUFFER DE ESCRITURA
                bw.close();
            System.out.println("Done \n");
            //SI OCURRIERA ALGÚN ERROR CON ESTA FUNCIÓN LO RECONOCERÍAMOS
            } catch (IOException e) {
                e.printStackTrace();
  }
 }
}   

C

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>

JNIEXPORT jobjectArray JNICALL Java_ReadFileJNI_readfile(JNIEnv *env,  jobject jobj)
{

//Se inicializan las variables 
jstring str;
jsize len = 1;
jobjectArray objectarray = 0;


// Crear variable tipo "File" que es apuntadora y llamar a la funsion fopen, "rb" -> leer archivo/tipo binario
FILE * flujo = fopen("Datos.txt","rb");

// Mueve el flujo al final del archivo, SEEK_END -> final del archivo  
fseek(flujo, 0 , SEEK_END);

/* Da la cantidad total de elementos ya que el ftell pregunta donde 
   se encuentra el flujo y eso se almacena en la variable 
*/
int num_elementos = ftell(flujo);

//Mueve el flujo al inicio del archivo
rewind(flujo);

/* Crear un arreglo de caracteres dinamico, calloc-> de que tamaño en bytes va a ser cada elemento del arreglo 
   se le manda cuanta cantidad de elementos quiere reservar
*/
unsigned char * cadena = (unsigned char *) calloc(sizeof(unsigned char), num_elementos);

/* fread recibe un arreglo donde metera todo el contenido del flujo y que tamaño es elemento que se quiere leer
   y cuantos se quieren leer y como se quieren leer todos se pone el # de elementos  y se le manda de donde 
   extraera la informacion
*/
int num_elemetos_leidos = fread(cadena,sizeof(unsigned char), num_elementos,flujo);

//Se realiza la asignacion del arreglo para enviarlo    
objectarray = (*env)->NewObjectArray(env,len,(*env)->FindClass(env,"java/lang/String"),0);
str = (*env)->NewStringUTF(env,cadena);
(*env)->SetObjectArrayElement(env,objectarray,0,str);

//se libera memoria dinamica de la cadena y se cierra el flujo 
free(cadena);
fclose(flujo);
return objectarray;
}
5
задан 01.05.2019, 22:53
1 ответ

Уже я сделал упражнение прощение из-за опоздания.

C

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include "ReadFileJNI.h"

JNIEXPORT jbyteArray JNICALL Java_ReadFileJNI_readfile(JNIEnv *env,  jobject jobj)
{

//Se inicializan las variables 
jstring str;
jsize len = 1;


// Crear variable tipo "File" que es apuntadora y llamar a la funsion fopen, "rb" -> leer archivo/tipo binario
FILE * flujo = fopen("Datos.txt","rb");

// Mueve el flujo al final del archivo, SEEK_END -> final del archivo  
fseek(flujo, 0 , SEEK_END);

/* Da la cantidad total de elementos ya que el ftell pregunta donde 
   se encuentra el flujo y eso se almacena en la variable 
*/
int num_elementos = ftell(flujo);

//Mueve el flujo al inicio del archivo
rewind(flujo);

/* Crear un arreglo de caracteres dinamico, calloc-> de que tamaño en bytes va a ser cada elemento del arreglo 
   se le manda cuanta cantidad de elementos quiere reservar
*/
unsigned char * cadena = (unsigned char *) calloc(sizeof(unsigned char), num_elementos);

/* fread recibe un arreglo donde metera todo el contenido del flujo y que tamaño es elemento que se quiere leer
   y cuantos se quieren leer y como se quieren leer todos se pone el # de elementos  y se le manda de donde 
   extraera la informacion
*/
int num_elemetos_leidos = fread(cadena,sizeof(unsigned char), num_elementos,flujo);

jbyteArray arr =(*env)->NewByteArray(env,num_elementos);
(*env)->SetByteArrayRegion(env,arr, 0, num_elementos, (jbyte*) cadena);

//se libera memoria dinamica de la cadena y se cierra el flujo 
free(cadena);
fclose(flujo);
return arr;
}

Java

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class ReadFileJNI {

    native byte[] readfile();

    static {
        System.loadLibrary("ReadFileJNI");
    }

    static public void main(String args[]) {
//SE CREA UN OBJETO DE LECTURA QUE TENDRÁ COMUNICACIÓN CON "C"
        ReadFileJNI obj = new ReadFileJNI();
//SE CREA UN ARREGLO PARA LA LECTURA DE DATOS
        byte[] buffer = obj.readfile();
        System.out.println(" El arreglo desde C es: \n ");
//SE ASIGNA EL ARREGLO A UNA CADENA
        System.out.println(new String(buffer));
        try {
            //ESPECIFICAMOS LA RUTA DONDE SE CREARA EL ARCHIVO DONDE SE COPIARAN LOS DATOS
            File file = new File("datos2.txt");
            //SI EL ARCHIVO NO EXISTE ENTONCES LO CREA
            if (!file.exists()) {
                file.createNewFile();
            }
            //LLAMAMOS LA FUNCIÓN QUE ESCRIBIRÁ LOS DATOS EN EL  NUEVO  ARCHIVO
            OutputStream fw = new FileOutputStream(file.getAbsoluteFile());
            fw.write(buffer);
            //CERRAMOS EL BUFFER DE ESCRITURA
            fw.close();
            System.out.println("Done \n");
            //SI OCURRIERA ALGÚN ERROR CON ESTA FUNCIÓN LO RECONOCERÍAMOS
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
1
ответ дан 03.12.2019, 19:30
  • 1
    Я был provando твое решение, но он производит мне ошибки... предположительно я единственной, что, должно быть, меняется, является часть objectarray = ( env) - > NewObjectArray (env, len, (*env) > FindClass (env, " java/lang /* " String" **), 0); str = (*env) - > ** NewStringUTF ** (env, цепь); (*env) - > SetObjectArrayElement (env, objectarray, 0, str);.... только espas для того, чтобы он распознал байт, но не как – Edu Arias 26.10.2016, 23:47
  • 2
    Мне не хватало Ok добавлять эти изменения в Java: native String [] readfile (); заменять из-за байт [] readfile (); И в C это: JNIEXPORT jbyteArray JNICALL Java_ReadFileJNI_readfile (JNIEnv *env, jobject jobj) – Ajeno 27.10.2016, 00:11
  • 3
    ты был прав не было части java и уже эта изменила ее, с которым ты предоставлял меня, но часть C продолжает давать мне ошибку даже меняя JNIEXPORT – Edu Arias 27.10.2016, 00:25
  • 4
    Была одна согрешите и # 241; в confusi и # 243; n в c и # 243; я говорю C с C ++ привет. – Ajeno 27.10.2016, 18:09
  • 5
    Большой Sos большое спасибо уже проверил, что это было тем, чего не было большое спасибо из-за yuda – Edu Arias 27.10.2016, 20:20