[JNI] Utilizar métodos e return do JAVA em C

12 respostas
willkun

Olá,
minha chefe me pediu para fazer algo em C++, mas não achei nenhuma solução boa, achei então uma ótima biblioteca em JAVA e ela me disse que poderia usar em java e depois com JNI criar funções que funcionem no C, criei uma classe que se adequa as necessidades do projetos e depois fui pesquisar sobre JNI e é para funcionar tanto C p/ JAVA ou JAVA p/ C, mas só encontro exemplos de C p/ JAVA

alguem tem algum exemplo que mostre como tem que criar as classes, se tem que criar algum .h de criar esse link do JAVA p/ C?

aqui o código da minha classe que eu quero que funcione em C

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.jopendocument.dom.spreadsheet.Sheet;
import org.jopendocument.dom.spreadsheet.SpreadSheet;

public class ODSDecoder {

	private Sheet sheet;

	private String error;

	public ODSDecoder() {
		this.sheet = null;
	}

	public String inicializeDocument(String path) {
		File file = new File(path);
		try {
			this.sheet = SpreadSheet.createFromFile(file).getSheet(0);
		} catch (FileNotFoundException e) {
			setError("Arquivo não encontrado.");
		} catch (IOException e) {
			setError("Arquivo corrompido ou erro de leitura.");
		}
		return "Arquivo lido com sucesso.";
	}

	public String getCelDataByHash(String cellName) {
		return (String) this.sheet.getValueAt(cellName);
	}

	public String getCelDataByColumn(String columnName, int row) {
		return (String) this.sheet.getValueAt(columnName + row);
	}

	public String getCelDataByIndex(int column, int row) {
		return (String) this.sheet.getValueAt(column, row);
	}

	public void changeValueByHash(String cellName, String value) {
		this.sheet.getCellAt(cellName).setValue(value);
	}

	public void changeValueByIndex(int column, int row, String value) {
		this.sheet.getCellAt(column, row).setValue(value);
	}

	public void saveDocument(String path, String name) {
		File outputFile = new File(path + name + ".ods");
		try {
			sheet.getSpreadSheet().saveAs(outputFile);
		} catch (FileNotFoundException e) {
			setError("Arquivo não encontrado.");
		} catch (IOException e) {
			setError("Arquivo corrompido ou erro de leitura.");
		}
	}

	public String getError() {
		return error;
	}

	public void setError(String error) {
		this.error = error;
	}

}

12 Respostas

J

O que a sua chefe quer que você faça em c++?

E

Acho que é melhor, no seu caso, você usar uma biblioteca C++ mesmo; é bem difícil você chamar uma classe Java em um programa C/C++ - você precisa saber muita coisa para fazer isso funcionar sem explodir alguma coisa (principalmente o tempo para você fazer as coisas :frowning: )

http://api.openoffice.org/

J

entanglement:
Acho que é melhor, no seu caso, você usar uma biblioteca C++ mesmo; é bem difícil você chamar uma classe Java em um programa C/C++ - você precisa saber muita coisa para fazer isso funcionar sem explodir alguma coisa (principalmente o tempo para você fazer as coisas :frowning: )

http://api.openoffice.org/

Imagino que seja muito mais fácil codificar tudo em c++ mesmo.

Marky.Vasconcelos

Acredito que JNI é apenas de C para Java.

Deve ser mais facil para voce implementar tudo em C++.

E

Marky.Vasconcelos:
Acredito que JNI é apenas de C para Java.

Deve ser mais facil para voce implementar tudo em C++.

Você quer dizer “um programa Java chamar um programa em C”, não?

De qualquer maneira, JNI também pode ser usado para o contrário de forma muito limitada - um programa em C pode carregar uma máquina virtual Java e controlar algumas das suas funções - por exemplo, é assim que o java.exe funciona: ele é um programa em C que carrega a JVM e então prepara um array de java.lang.String[] contendo os parâmetros, e chama o método estático “main” da classe passada como parâmetro. Não dá para fazer muito mais que isso sem ter de ralar muito, o que acredito que você não vai ter tanto tempo assim.

J

se for para trabalhar com c++, usa o qt framework. Tem plugins para a maioria dos bancos de dados.

http://qt.nokia.com/

Marky.Vasconcelos

entanglement:
Marky.Vasconcelos:
Acredito que JNI é apenas de C para Java.

Deve ser mais facil para voce implementar tudo em C++.

Você quer dizer “um programa Java chamar um programa em C”, não?

É isso mesmo, pensei que tinha me expressado o suficiente.

E o que o cara quer fazer provavelmente é o JNI ao contrario.
Tipo ter um header em C colocando tipo “java void calcular()” e ter o arquivo java perto pra invocar o método, e isso acredito não ser possivel.

J

Marky.Vasconcelos:
entanglement:
Marky.Vasconcelos:
Acredito que JNI é apenas de C para Java.

Deve ser mais facil para voce implementar tudo em C++.

Você quer dizer “um programa Java chamar um programa em C”, não?

É isso mesmo, pensei que tinha me expressado o suficiente.

E o que o cara quer fazer provavelmente é o JNI ao contrario.
Tipo ter um header em C colocando tipo “java void calcular()” e ter o arquivo java perto pra invocar o método, e isso acredito não ser possivel.

Pode ser sim, mas não compensa. É preferível escrever o algoritmo de novo que mapear uma classe java.

Marky.Vasconcelos

Mas é possivel fazer isso em C?
Eu nao sabia. Tem link?

willkun

bom, acho que vocês responderam direito, tinha pego uma apostila da Sun de jni, ela dá exemplo de C para JAVA, do jeito q sei fazer, criando os native, fazendo o .h e depois implementando no C, mas ao contrario eles não especificam quase nada, só que tem q usar umas classes do tipo jString para receber string do java… resumindo, melhor fazer em C++ mesmo né

sim tem como usar JNI C~>JAVA e JAVA~>C mas pelo jeito é muito complicado

J

Marky.Vasconcelos:
Mas é possivel fazer isso em C?
Eu nao sabia. Tem link?

Bom dia mark,

este link demonstra como fazer.

http://java.sys-con.com/node/45840

Marky.Vasconcelos

juliocbq:
Marky.Vasconcelos:
Mas é possivel fazer isso em C?
Eu nao sabia. Tem link?

Bom dia mark,

este link demonstra como fazer.

http://java.sys-con.com/node/45840

Nossa, realmente.
Mas não é nada trivial.
Melhor pro amigo do tópico é reimplementar a lógica em C.

Criado 16 de julho de 2010
Ultima resposta 19 de jul. de 2010
Respostas 12
Participantes 4