在Android上使用BroadcastReceiver从Java报警器执行本地代码。

问题描述 投票:0回答:1

首先,我是Android和Java的新手,所以我的大部分东西都是用原生代码做的。我这样做主要是为了速度,因为我的代码必须处理图像处理。

我的应用程序是一个延时摄影机,它每隔一段时间就必须醒来,获取一个唤醒锁,拍摄一些照片,处理它们,设置一个新的闹钟,然后进入睡眠状态。

我的闹钟接收器代码是这样的。

public class MyBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = "Something";

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.e(TAG, "We got alarm :)");

        new Thread(new Runnable() {
            public void run() {
                CameraActivity.cameraraw.call_alarm();  }
        }).start();
}

CameraActivity.cameraraw.call_alarm(); 只是调用一个JNI函数 然后把控制权交给我的c代码,看起来是这样的:

JNIEXPORT jbyte JNICALL Java_com_example_android_camera2raw_Camera2RawFragment_rtc_1alarm(JNIEnv* env,jclass clazz,jobject cameraraw)
{
    syslog(LOG_CRIT, "Alarm in native code, picture %s",cur_timelapse_pic);

    wake_me_up(env,clazz,cameraraw);

    sleep(5);

    if(cur_timelapse_pic<timelapse_shots)
    {
        do_focus_stack(env,clazz,cameraraw,cur_timelapse_pic);
        cur_timelapse_pic++;
        set_alarm(env,clazz,cameraraw,timelapse_delay);
    }

    go_to_sleep(env,clazz,cameraraw);
    syslog(LOG_CRIT, "Went to sleep");
}

代码在第一次报警时工作正常, 但第二次报警在syslog()之前就崩溃了.

2020-04-30 18:19:00.039 15198-15727com.example.android.camera2raw Wroid.camera2ra: 0xebadde09 跳过次数。0

--------- beginning of crash

2020-04-30 18:19:00.040 15198-15727com.example.android.camera2raw Alibc.Fatal signal 11 (SIGSEGV, code 1 (SEGV_MAPERR), fault addr 0x1 in tid 15727 (Thread-8), pid 15198 (roid.camera2raw): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1 in tid 15727 (Thread-8), pid 15198 (roid.camera2raw)2020-04-30 18:19:06.531 15198-15198com.example.android.camera2raw DViewRootImpl@1b051d4[CameraActivity]: 表面释放。android.view.ViewRootImpl$ViewRootHandler.handleMessage:4825 android.os.Handler.dispatchMessage:106。

我是不是遗漏了什么?另外,我的函数在下一个闹钟到来之前很久就完成了它的工作。

java android java-native-interface broadcastreceiver
1个回答
1
投票

cur_timelapse_pic 似乎是一个数字,但你却试图将其记录为一个字符串(%s). 改为 %d%u 而不是。

© www.soinside.com 2019 - 2024. All rights reserved.