Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje
Uputstvo Članstvo Kalendar Današnje poruke Pretraži

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 13.10.2011, 15:39   #1
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Android - pozivanje Java metoda iz native koda

Treba da realizujem nativnu C funkciju u okviru Android aplikacije, ali tako da ta funkcija ima mogućnost pozivanja određene Java metode iz klase u kojoj je deklarisana i ta nativna metoda. Ovo treba da radi kao callback, jer će nativna funkcija raditi duže vremena u petlji, a tokom rada bi trebalo da šalje povratne signale roditeljskoj Java klasi, bez izlaska iz same funkcije.

Imam Activity koji sadrži jedan EditText i jedan Button. Klikom na Button se poziva nativna funkcija (nativeMethod), koja onda iz sebe pozove Java metodu (callback), a koja onda ubaci neki tekst u EditText (trivijalna situacija, treba mi samo da isprobam da li to radi).

HTML kod:
public class JNICallbackTestActivity extends Activity {
	
	static {
		System.loadLibrary("native");
	}
	
	public EditText editText;
	public Button btnDodaj;
	
	private native void nativeMethod();
	
	private void callback() {
		editText.setText("Calling from C.");
	}
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        editText = (EditText) findViewById(R.id.editText);
        btnDodaj = (Button) findViewById(R.id.btnDodaj);
        
        btnDodaj.setOnClickListener(new OnClickListener() {
		public void onClick(View v) {
			nativeMethod();
		}
	});
    }
}
Nativna funkcija izgleda ovako:

HTML kod:
#include <jni.h>

JNIEXPORT void JNICALL Java_rs_pupin_Callbacks_nativeMethod(JNIEnv *env, jobject obj)
{
	jclass cls = (*env)->GetObjectClass(env, obj);
	//jclass cls = (*env)->FindClass(env, "rs/pupin/JNICallbackTestActivity");

	jmethodID msgid = (*env)->GetMethodID(env, cls, "callback", "()V");
	if (msgid == 0) return;

	(*env)->CallVoidMethod(env, obj, msgid);
}
Međutim, čim kroči u nativnu funkciju, program krešuje (kako god da pokušam da pročitam jclass, i preko prve i preko ove druge iskomentarisane varijante). Guglam ceo dan i nalazim svašta ali ništa konkretno, da li je neko imao slična iskustva? Hvala unapred.
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 13.10.2011, 16:36   #2
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Android - pozivanje Java metoda iz native koda

Jes' da se razumem u Javu ko Marica u krivi k... al' cu da probam da pomognem.
Ne znam koji IDE i kakav debugger se koristi za Javu, probaj da proveris validnost parametara, odnosno "env" pointera koji koristis u "Java_rs...Method" funkciji, posto kazes:
Citat:
...program krešuje (kako god da pokušam da pročitam jclass, i preko prve i preko ove druge iskomentarisane varijante)
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 13.10.2011, 18:45   #3
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Android - pozivanje Java metoda iz native koda

env je pokazivač na pokazivač na java environment i sadrži između ostalog razne funkcije, recimo NewStringUTF koji služi za dobijanje java stringa od char* stringa (i on radi). Problem je što je sve ovo jako slabo dokumentovano, tj postoji nekakva dokumentacija za klasični java native interface, ali C to Java primeri odatle prosto ne rade u Android varijanti... zato reko' da pitam jel neko možda pokušavao nešto slično, na jednom mestu kaže da jclass cls treba da bude statička promenljiva izvan funkcija, na drugom daju neke primere iz ranih verzija Androida kada je native kod bio čist hack, guglajući sam samo zaključio da je ovo jedan veliki clusterfuck...

Inače cenim da je problem u GetObjectClass, s tim što poruka koju debugger izbacuje nije baš informativna...
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 13.10.2011, 19:10   #4
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Smile Re: Android - pozivanje Java metoda iz native koda

Može vrlo lako da se desi da si zeznuo build ili jni binder (koristi javah tool da generises .c file).

Inace, probao sam kod sebe, radi, evo koda (minimalno sam modifikovao hello-jni):

Java:
Kod:
package com.example.hellojni;

import android.app.Activity;
import android.app.AlertDialog;
import android.widget.TextView;
import android.os.Bundle;


public class HelloJni extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

    
        TextView  tv = new TextView(this);
        //tv.setText( ) );
        setContentView(tv);
        stringFromJNI();
    }


    public native String  stringFromJNI();
    
    public void callback()
    {
    	AlertDialog.Builder builder = new AlertDialog.Builder(this);
    	builder.setMessage("Callback from JNI.")
    	       .setCancelable(true);
    	       
    	AlertDialog alert = builder.create();
    	alert.show();
    }

    static {
        System.loadLibrary("hello-jni");
    }
}
JNI
Kod:
#include <string.h>
#include <jni.h>
#include <android/log.h>
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
	    jclass clazz = (*env)->FindClass(env, "com/example/hellojni/HelloJni");
	    jmethodID mId = (*env)->GetMethodID(env, clazz, "callback", "()V");
	    (*env)->CallVoidMethod(env, thiz, mId);


    return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Spakovao sam ti i ceo projekat sa makefileovima, mada ćes morati da podesiš build path za cygwin u njima.
Priloženi fajlovi
Tip fajla: rar hello-jni.rar (8,2 KB, 6 puta viđeno)
MG-RAY je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci:
voodoo_ (13.10.2011)
Stara 13.10.2011, 19:23   #5
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Android - pozivanje Java metoda iz native koda

Hvala puno, probaću čim pre. Inače radim na Linuxu tako da nema potrebe za Cygwinom
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 14.10.2011, 8:59   #6
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Android - pozivanje Java metoda iz native koda

Pronašao sam gde je bila greška

Pogrešno sam imenovao funkciju u C fajlu, umesto

Java_rs_pupin_Callbacks_nativeMethod

treba

Java_rs_pupin_JNICallbackTestActivity_nativeMethod

pošto je šablon Java_paket_klasa_metod, a kad sam gledao neki tutorial zaboravio sam da promenim u ime svoje klase

Još juče buljim u ovo tri sata i lupam glavu, a sad sam za dva minuta izvalio šta je problem Eto šta ti je kad sedneš hladne glave za kompjuter

Hvala ponovo!
voodoo_ je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi


Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Java, tabela, TableModel i citanje iz baze mcdhappy80 Programiranje 3 3.12.2010 6:14
Java - Vraćanje objekta iz reda tabele mcdhappy80 Programiranje 0 2.12.2010 5:13
Pozivanje Java apleta u HTML-u? qwert Web razvoj 10 8.10.2010 16:53


Sva vremena su po Griniču +2 h. Sada je 8:16.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com