Metody natywne

0

Witam.
'Napisałem' sobie program w javie. Chcę żeby korzystał z funkcji napisanej w języku C do liczenia prostych rzeczy.

class Mat{
    native public void licz();

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

    public static void main(String[] args){
	new Mat().licz();
    }
}

Pierwsze co robię to kompiluję program, oczywiście z błędem, ponieważ nie mam jeszcze metody licz.
Tworzy mi się plik Mat.class z którego trzeba utworzyć plik nagłówkowy z rozszerzeniem *.h.
Wiem że do tego trzeba użyć programu javah, lecz gdy go odpalam to w lini poleceń wywala mi błąd:
javadoc: error - Illegal package name "ścieżka do pliku Math.class"

Może mnie ktoś nakierować jak mam stworzyć ten plik nagłówkowy?

0
kamil_lk napisał(a)

Pierwsze co robię to kompiluję program, oczywiście z błędem, ponieważ nie mam jeszcze metody licz.
Tworzy mi się plik Mat.class (...)

Cos nie pasi - Math.java ma bledy kompilacji, wiec nie powstaje nigdy plik Math.class.

0

powstaje, kompiluje to przy pomocy programu javac i wtedy w katalogu src/mat mam dwa pliki Mat.java i Mat.class

a jak mam wywołać ten program javah, z którym plikiem? Mat.java czy mat.class?

ja robię to w ten sposób:
w lini poleceń przechodze do katalogu java/jdk/bin i tam wpisuję javah -jni C:/Users/kamil/Documents/Mat/build/classes/mat/Mat.java lub Mat.class

lecz niestety wywala błąd

0

Nie dodawas '.class', wolaj z samym 'Math'.

0

jest to samo.. :/

0
public class Test {

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

    public native int test();

    public static void main(String[] args) {
        new Test().test();
    }
}

javac Test.java (dostaje Test.class w tym samym katalogu)
javah Test i dostaje:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    test
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_Test_test
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Chyba wiec dziala?

0

a możesz mi powiedzieć jak to uruchomić z lini poleceń?
czy pliki javac i javah mają być tam gdzie projekt czy w java/jdk/bin
bo jak jestem w katalogu bin i wpisuję javah Test to wywala błąd

0
kamil_lk napisał(a)

a możesz mi powiedzieć jak to uruchomić z lini poleceń?

Normalnie, przeciez sam uruchamiales: wpisujesz 'javac Math.java' i juz. Jesli nie masz java w sciezce, musisz poczytac jak dodac, lub wywolywac javac i javah z pelna absolutna sciezka. Nie mam zamiaru o tym pisac bo i na tym forum i w necie sa tony informacji.

kamil_lk napisał(a)

czy pliki javac i javah mają być tam gdzie projekt czy w java/jdk/bin

Plili javac i javah to sa programy wchodzace w sklad JDK i maja tam zostac.

kamil_lk napisał(a)

bo jak jestem w katalogu bin i wpisuję javah Test to wywala błąd

Jaki blad? Nie jestem jasnowidzem.

0

Pokazuje mi taki błąd:
user image
Lub taki w zależności czy podam ścieżke do pliku czy nie
user image

0

Nie masz w tym katalogu pliku Test - chyba jesny komunikat? W katalogu bin JDK nie masz miec zadnych plikow. Masz miec jakis swoj katalog gdzie masz te pliki i je kompilujesz, a polecenia z bin tylko wywolujesz.
Nie obraz sie, ale Ty nie jestes w tej chwili w stanie napisac zadnego programu w Javie. A Ty sie rzucasz na smiganie natywnego kodu... Sadzac po tym ze nie umiesz wywolac narzedzi z lini polecen, i uzywasz Windowsa (taki joke ;d), programista C z Ciebie tez zaden. Duzo czasu przed Toba, ale nie zrazaj sie tekstami jak te - badz twardy.

0

cd c:\Users\kamil\Documents\NetbeansProjects\Test\src\test
javac Test.java
cd ..
javah test.Test

voila!
Zakladam ze javac i javah sa w sciezce, ale jak widze masz Viste lub 7 wiec po instalacji JDK powinno byc z automatu.

0

Trza być twardym a nie mientkim :)

Mam w katalogu plik Test. java i jak w linii poleceń będąc w katalogu bin odpalam javac ze ścieżką do pliku Test.java to tworzy mi się plik Test.class, i dalej będąc w katalogu bin odpalam javah z identyczną ścieżką do pliku tylko już bez rozszerzenia.. bo chyba tak mam to robić, czy nie?

0

Zapomnij w ogóle o katalogu bin. Gdybyś miał poprawnie skonfigurowany system i prawa dostępu, to w ogóle nie powinieneś mieć prawa do zapisu w takim katalogu. Java instalując się powinna ustawić swój katalog (bin) na liście przeszukiwania plików wykonywalnych, więc javac oraz inne narzędzia z tej paczki powinny odpalać się z dowolnego katalogu bieżącego - w szczególności z katalogu w którym trzymasz swoje źródła. Jeżeli tak się nie dzieje, to use google jak sprawić, żeby tak było.

Poza tym jak chcesz przekazać wyniki obliczeń metody licz(), skoro jest to procedura? (wynik typu void).

0

Na pewno powinna? Z mojego doświadczenia wynika, że nie dodaje się sama do PATH, ani nie tworzy zmiennej JAVA_HOME i nadal trzeba to robić ręcznie. No chyba, że Javę na Windowsie już tak dawno instalowałem, że sprawy się zmieniły.

0

Pod windowsem od dawna jest tak, ze jak sie instaluje jave to java.exe, javaw.exe oraz javaws.exe dodawane so do c:\windows\system32. Jako ze ten katalog jest w sciezce zawsze, nie trzeba cudowac z PATH ani JAVA_HOME. Problem powstaje wowczas gdy instaluje sie kilka JDK w roznych wersjach (np kiedys 1.4 i 5, pozniej 5 i 6, wkrotce lub juz 6 i 7) - kazda kolejna nadpisuje te pliki, czyli zmienia domyslne srodowiko uruchomieniowe.
Ja z zasady jak instaluje JDK pod winsowsem to od razu wywalam te wspomniane pliki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1