JNI не работает правильно в Flutter: FFIC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 JNI не работает правильно в Flutter: FFI

Сообщение Anonymous »

Я пытаюсь вызвать функцию через переменную среды env , а именно env-> findclass ("Android/OS/BatteryManager") , но в конечном итоге ошибка

Код: Выделить всё

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);
}
код из Batteryinfoffiplugin.java :

Код: Выделить всё

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();
}
Полный projec t: ateral_info
Я попытался сделать это через Android.content.context , передавая его на собственные методы, но результат не отличался, и были даны аналогичные ошибки. Я также пытался тестировать на других устройствах, с другими, но результат одинаково.

Подробнее здесь: https://stackoverflow.com/questions/797 ... flutterffi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»