mercredi 22 juin 2016

Toast not displaying when C function is called

I have a service that can either be started with a launcher or runs on boot. The problem is that when I call a C function with JNI, all the Toast notifications are no longer displayed, whereas if I call only the java method, the Toast notifications display just fine. What causes this and how can I fix it?

Note: If the C function does something simple like calls back to java and terminates, the Toast notifications will display. My function however, has an infinite loop used to handle interrupts.

ServiceLauncher

public class ServiceLauncher extends AppCompatActivity  {
    @Override
    public void onCreate(Bundle savedInstanceState)  {
        Toast.makeText(getBaseContext(), "onCreate", Toast.LENGTH_LONG).show();
        super.onCreate(savedInstanceState);
        startService(new Intent(this, MyService.class));
        finish();
    }
}

MyService

public class MyService extends Service  {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public void onDestroy() {
        Toast.makeText(this, "Terminated", Toast.LENGTH_LONG).show();
    }

    @Override
    public int onStartCommand(Intent intent,int flags, int startid)  {
        Toast.makeText(this, "Running", Toast.LENGTH_LONG).show();
        javaMethod(); /*toast displays if this is called*/
        cMethodFromJNI(); /*toast does not display if this is called*/
        return START_STICKY;
    }
}

C code structure

JNIEXPORT jint JNICALL
Java_className_cMethodFromJNI(JNIEnv *env, jclass type) {


    jmethodID mid = (*env)->GetStaticMethodID(env, type, "javaMethod", "(I)V");

   // open and read some fd (not shown)

    for (;;) {
        // wait on change in fd and act on it (not shown)
        callJavaAgain(env,type,mid)
        }
    }
   //close fd (not shown)
    exit(0);
}

Aucun commentaire:

Enregistrer un commentaire