Prośba o pomoc w JNI

0

Witam,

Nie znalazłem na forum dużo tematów dotyczących JNI ale być może ktoś będzie wstanie pomóc mi w moim problemie. Być może znacie jakieś bardziej odpowiednie forum ze specjalistami od JNI (najlepiej w połączeniu z wiedzą od androida). Staram się przy pomocy tej technologi uruchomić kod c++ pod androidem używając oficjalnego NDK. Myśle, że zacznę od opisania funkcjonalności c++, którą chciałem przenieść do JNI

 MyCppClass cppObject; //to jest obiekt klasy C++ który posiada w sobie dużo metod i wiele buforów (cała klasa składa się w ogóle z wielu plików) 
for ( i = 0 ; i <smpleLenght; i++)
{
//tutaj nastepuje odczyt z pliku wav i poprzez zwykłą tablice float przekazywany dalej do funkcji poniżej
//ta część kody ma być zastąpiona interfejsem androida do wczytywania plików. 

cppObject.function(arrayoffloats,size); //tutaj wywołuje metodę obiektu cppObject i która jako argument przyjmuje wskaźnik do tablicy float o rozmiarze podanym w zmiennej size. Wyniki działania tej funkcji są dopisywane do bufora będące częścią obiektu cppObject.
}

int size1;
float * results = cppObject.returnResultsBuffer(size1);  //po zakończonej pętli for zwracam wskaźnik do bufora zawierającego wyniki działania powyższej funkcji a rozmiar bufora jest poprzez referencje zapisywany w zmiennej size1

Dzięki JNI mogę tylko wywoływać funckję w Javie. Oznacza to, że muszę napisać 3 metody:
-funkcję tworzącą obiekt cppObject
-metodę która będzie wywoływana w pętli w Javie i w jej wnętrzu uruchamiana będzie funkcja cppObject.function()
-metodę która uruchomię po ostatniej iteracji pętli i jej wnętrzu wywołam funkcję cppObject.returnResultsBuffer() i zwrócę wyniki w postaci tablicy float na zewnątrz do Javy

I Teraz właśnie pojawiają się moje pytania:

  1. W jaki sposób mam stworzyć obiekt cppObject żeby był on wywoływany w pozostałych dwóch funkcjach i 'pamiętał' wyniki poszczegółnych iteracji dopisywanych do bufora w jego wnętrzu? jedyne co przychodzi mi do głowy to zdefiniować go jako obiekt globalny w pliku .cpp ale nie wiem czy tak się da i jak to zrobi przy pomocy JNI.
  2. Jak poprawnie napisać funkcję JNI która przyjmie jako argument tabice float z Javy i będzie ją mogła w całości przekazać do funkcji C++, która jako argument przyjmuje wskaźnik ?
  3. Jak poprawnie napisać funkcję JNI która przechwyci wskaźnik float zwracany przez funkcję zwracającą bufor i zwrócenie go na zewnątrz do Javy w postaci tablicy float z danymi?
0

Niestety nie używałem za bardzo JNI więc na twoje pytania nie odpowiem. Jednak mogę nakierować cię na rozwiązanie które być może będzie dla ciebie bardziej atrakcyjne (o ile wydajność nie jest dla ciebie krytyczna)
http://en.wikipedia.org/wiki/Java_Native_Access
Zwróć jednak uwagę że nie jest to część Java SE API

0

Co do 1. to jest to troszkę skomplikowane, ale się da. Jeżeli potrzebujesz tylko jednej instancji to obiekt globalny będzie git. Piszesz tak jakby JNI nie istniało. Jeżeli jednak potrzebujesz mieć kilka obiektów i koniecznie móc je rozróżniać to musisz wykorzystać jakąś mapę i przy wywołaniu metody natywnej przekazywać identyfikator.
Co do 2 i 3. to będzie ciężko. Spróbuj zapytać na forum suna. Jest dział poświęcony JNI.

0

ok dzięki coś wykombinuję

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