在 Android 上使用 BroadcastReceiver 从 Java 警报执行本机代码
Executing native code from a Java alarm using BroadcastReceiver, on Android
首先,我是 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-15727/com.example.android.camera2raw W/roid.camera2ra: 0xebadde09 跳过次数: 0
--------- beginning of crash
2020-04-30 18:19:00.040 15198-15727/com.example.android.camera2raw A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) , tid 15727 (Thread-8) 中的故障地址 0x1,pid 15198 (roid.camera2raw)
2020-04-30 18:19:06.531 15198-15198/com.example.android.camera2raw D/ViewRootImpl@1b051d4[CameraActivity]:表面发布。 android.view.ViewRootImpl$ViewRootHandler.handleMessage:4825 android.os.Handler.dispatchMessage:106
有什么我遗漏的吗?顺便说一句,我的功能在下一个警报到来之前很久就完成了它的工作。
任何帮助将不胜感激!
cur_timelapse_pic
似乎是一个数字,但您正试图将其记录为字符串 (%s
)。改为 %d
或 %u
。
首先,我是 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-15727/com.example.android.camera2raw W/roid.camera2ra: 0xebadde09 跳过次数: 0
--------- beginning of crash
2020-04-30 18:19:00.040 15198-15727/com.example.android.camera2raw A/libc:致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) , tid 15727 (Thread-8) 中的故障地址 0x1,pid 15198 (roid.camera2raw) 2020-04-30 18:19:06.531 15198-15198/com.example.android.camera2raw D/ViewRootImpl@1b051d4[CameraActivity]:表面发布。 android.view.ViewRootImpl$ViewRootHandler.handleMessage:4825 android.os.Handler.dispatchMessage:106
有什么我遗漏的吗?顺便说一句,我的功能在下一个警报到来之前很久就完成了它的工作。 任何帮助将不胜感激!
cur_timelapse_pic
似乎是一个数字,但您正试图将其记录为字符串 (%s
)。改为 %d
或 %u
。