![]() |
![]() |
|
Programiranje Programski jezici, tehnike, alatke... |
![]() |
|
Alatke vezane za temu | Vrste prikaza |
![]() |
#1 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.272
Zahvalnice: 2.175
Zahvaljeno 5.003 puta na 2.916 poruka
|
![]()
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);
}
|
![]() |
![]() |
![]() |
#2 | |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
![]()
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:
|
|
![]() |
![]() |
![]() |
#3 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.272
Zahvalnice: 2.175
Zahvaljeno 5.003 puta na 2.916 poruka
|
![]()
env je pokazivač na pokazivač
![]() Inače cenim da je problem u GetObjectClass, s tim što poruka koju debugger izbacuje nije baš informativna... |
![]() |
![]() |
![]() |
#4 |
Starosedelac
|
![]()
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) |
![]() |
#5 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.272
Zahvalnice: 2.175
Zahvaljeno 5.003 puta na 2.916 poruka
|
![]()
Hvala puno, probaću čim pre. Inače radim na Linuxu tako da nema potrebe za Cygwinom
![]() |
![]() |
![]() |
![]() |
#6 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.272
Zahvalnice: 2.175
Zahvaljeno 5.003 puta na 2.916 poruka
|
![]()
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 ![]() ![]() Hvala ponovo! |
![]() |
![]() |
![]() |
Bookmarks sajtovi |
|
|
![]() |
||||
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 |