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:
- 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.
- 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 ?
- 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?