Код: Выделить всё
F/libc (27883): Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 27883 (meerkat.rukkola), pid 27883 (meerkat.rukkola)
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/sdk_gphone64_x86_64/emu64xa:15/AE3A.240806.005/12228598:user/release-keys'
Revision: '0'
ABI: 'x86_64'
Timestamp: 2025-08-08 12:01:41.442403800+0000
Process uptime: 11s
Cmdline: com.nelset.meerkat.rukkola
pid: 27883, tid: 27883, name: meerkat.rukkola >>> com.nelset.meerkat.rukkola : < /p>
#include
extern "C" JNIEXPORT jint JNICALL
Java_com_example_battery_info_ffi_BatteryInfoFfiPlugin_getBatteryLevel(JNIEnv *env, jobject thiz)
{
// Получаем уровень заряда батареи через Android NDK
jclass batteryManagerClass = env->FindClass("android/os/BatteryManager");
jmethodID getSystemService = env->GetStaticMethodID(batteryManagerClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
jstring serviceName = env->NewStringUTF("batterymanager");
jobject batteryManager = env->CallStaticObjectMethod(batteryManagerClass, getSystemService, serviceName);
jmethodID getIntMethod = env->GetMethodID(batteryManagerClass, "getIntProperty", "(I)I");
jint batteryLevel = env->CallIntMethod(batteryManager, getIntMethod, 4); // 4 = BATTERY_PROPERTY_CAPACITY
return batteryLevel;
}
extern "C" JNIEXPORT jboolean JNICALL
Java_com_example_battery_info_ffi_BatteryInfoFfiPlugin_isCharging(JNIEnv *env, jobject thiz)
{
// Проверяем, заряжается ли устройство
return JNI_FALSE;
}
// Функции для Dart FFI
extern "C" JNIEXPORT jint JNICALL
get_battery_level(JNIEnv *env, jobject thiz, jobject context)
{
return Java_com_example_battery_info_ffi_BatteryInfoFfiPlugin_getBatteryLevel(env, thiz);
}
extern "C" JNIEXPORT jboolean JNICALL
is_charging(JNIEnv *env, jobject thiz, jobject context)
{
return Java_com_example_battery_info_ffi_BatteryInfoFfiPlugin_isCharging(env, thiz);
}
Код: Выделить всё
package com.example.battery_info_ffi;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import android.content.Context;
import android.os.Looper;
public class BatteryInfoFfiPlugin implements FlutterPlugin, MethodChannel.MethodCallHandler {
private MethodChannel channel;
private Context context;
static {
System.loadLibrary("battery_info_ffi");
}
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
context = binding.getApplicationContext();
channel = new MethodChannel(binding.getBinaryMessenger(), "battery_info_ffi");
channel.setMethodCallHandler(this);
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
if (Looper.myLooper() == null) {
Looper.prepare();
}
try{
if (call.method.equals("getBatteryLevel")) {
result.success(getBatteryLevel());
}
if (call.method.equals("isCharging")) {
result.success(isCharging());
} else {
result.notImplemented();
}
}catch(Exception e){
result.error("NATIVE_ERROR", e.getMessage(), null);
}
}
public native int getBatteryLevel();
public native boolean isCharging();
}
Я попытался сделать это через Android.content.context , передавая его на собственные методы, но результат не отличался, и были даны аналогичные ошибки. Я также пытался тестировать на других устройствах, с другими, но результат одинаково.
Подробнее здесь: https://stackoverflow.com/questions/797 ... flutterffi