|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
13.10.2011, 15:39 | #1 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
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(); } }); } } 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);
}
|
13.10.2011, 16:36 | #2 | |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
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:
|
|
13.10.2011, 18:45 | #3 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
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... |
13.10.2011, 19:10 | #4 |
Starosedelac
|
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"); } } 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 !"); } |
Sledeći korisnik se zahvaljuje korisniku MG-RAY na korisnoj poruci: | ||
voodoo_ (13.10.2011) |
13.10.2011, 19:23 | #5 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
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
|
14.10.2011, 8:59 | #6 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
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! |
Bookmarks sajtovi |
|
|
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 |