Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e9fe5d2 authored by Joe Huang's avatar Joe Huang Committed by Android (Google) Code Review
Browse files

Merge "Add IGnssAntennaInfo AIDL HAL (frameworks/base)"

parents 1360cb8a 89f7b911
Loading
Loading
Loading
Loading
+18 −30
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
#include <android/hardware/gnss/2.1/IGnssMeasurement.h>
#include <android/hardware/gnss/BnGnss.h>
#include <android/hardware/gnss/BnGnssAntennaInfo.h>
#include <android/hardware/gnss/BnGnssCallback.h>
#include <android/hardware/gnss/BnGnssDebug.h>
#include <android/hardware/gnss/BnGnssGeofence.h>
@@ -51,6 +52,7 @@
#include "android_runtime/Log.h"
#include "gnss/AGnss.h"
#include "gnss/AGnssRil.h"
#include "gnss/GnssAntennaInfo.h"
#include "gnss/GnssAntennaInfoCallback.h"
#include "gnss/GnssBatching.h"
#include "gnss/GnssConfiguration.h"
@@ -155,7 +157,6 @@ using IGnss_V2_1 = android::hardware::gnss::V2_1::IGnss;
using IGnssCallback_V1_0 = android::hardware::gnss::V1_0::IGnssCallback;
using IGnssCallback_V2_0 = android::hardware::gnss::V2_0::IGnssCallback;
using IGnssCallback_V2_1 = android::hardware::gnss::V2_1::IGnssCallback;
using IGnssAntennaInfo = android::hardware::gnss::V2_1::IGnssAntennaInfo;

using IMeasurementCorrections_V1_0 = android::hardware::gnss::measurement_corrections::V1_0::IMeasurementCorrections;
using IMeasurementCorrections_V1_1 = android::hardware::gnss::measurement_corrections::V1_1::IMeasurementCorrections;
@@ -179,6 +180,7 @@ using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds;
using IGnssPsdsCallbackAidl = android::hardware::gnss::IGnssPsdsCallback;
using IGnssConfigurationAidl = android::hardware::gnss::IGnssConfiguration;
using GnssLocationAidl = android::hardware::gnss::GnssLocation;
using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo;

struct GnssDeathRecipient : virtual public hidl_death_recipient
{
@@ -207,7 +209,6 @@ sp<IGnssNi> gnssNiIface = nullptr;
sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr;
sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr;
sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr;
sp<IGnssAntennaInfo> gnssAntennaInfoIface = nullptr;

std::unique_ptr<GnssConfigurationInterface> gnssConfigurationIface = nullptr;
std::unique_ptr<android::gnss::GnssMeasurementInterface> gnssMeasurementIface = nullptr;
@@ -218,6 +219,7 @@ std::unique_ptr<android::gnss::AGnssInterface> agnssIface = nullptr;
std::unique_ptr<android::gnss::GnssDebugInterface> gnssDebugIface = nullptr;
std::unique_ptr<android::gnss::AGnssRilInterface> agnssRilIface = nullptr;
std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr;
std::unique_ptr<android::gnss::GnssAntennaInfoInterface> gnssAntennaInfoIface = nullptr;

#define WAKE_LOCK_NAME  "GPS"

@@ -1163,12 +1165,18 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject
        }
    }

    if (gnssHal_V2_1 != nullptr) {
        auto gnssAntennaInfo = gnssHal_V2_1->getExtensionGnssAntennaInfo();
        if (!gnssAntennaInfo.isOk()) {
            ALOGD("Unable to get a handle to GnssAntennaInfo");
        } else {
            gnssAntennaInfoIface = gnssAntennaInfo;
    if (gnssHalAidl != nullptr && gnssHalAidl->getInterfaceVersion() >= 2) {
        sp<IGnssAntennaInfoAidl> gnssAntennaInfoAidl;
        auto status = gnssHalAidl->getExtensionGnssAntennaInfo(&gnssAntennaInfoAidl);
        if (checkAidlStatus(status, "Unable to get a handle to GnssAntennaInfo interface.")) {
            gnssAntennaInfoIface = std::make_unique<gnss::GnssAntennaInfoAidl>(gnssAntennaInfoAidl);
        }
    } else if (gnssHal_V2_1 != nullptr) {
        auto gnssAntennaInfo_V2_1 = gnssHal_V2_1->getExtensionGnssAntennaInfo();
        if (checkHidlReturn(gnssAntennaInfo_V2_1,
                            "Unable to get a handle to GnssAntennaInfo_V2_1")) {
            gnssAntennaInfoIface =
                    std::make_unique<gnss::GnssAntennaInfo_V2_1>(gnssAntennaInfo_V2_1);
        }
    }

@@ -1933,25 +1941,7 @@ static jboolean android_location_gnss_hal_GnssNative_start_antenna_info_listenin
        ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
        return JNI_FALSE;
    }

    sp<gnss::GnssAntennaInfoCallback> cbIface = new gnss::GnssAntennaInfoCallback(mCallbacksObj);

    auto result = gnssAntennaInfoIface->setCallback(cbIface);

    if (!checkHidlReturn(result, "IGnssAntennaInfo setCallback() failed.")) {
        return JNI_FALSE;
    }

    IGnssAntennaInfo::GnssAntennaInfoStatus initRet = result;
    if (initRet != IGnssAntennaInfo::GnssAntennaInfoStatus::SUCCESS) {
        ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d",
              static_cast<int32_t>(initRet));
        return JNI_FALSE;
    } else {
        ALOGD("gnss antenna info has been enabled");
    }

    return JNI_TRUE;
    return gnssAntennaInfoIface->setCallback(std::make_unique<gnss::GnssAntennaInfoCallback>());
}

static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening(JNIEnv* /* env */,
@@ -1960,9 +1950,7 @@ static jboolean android_location_gnss_hal_GnssNative_stop_antenna_info_listening
        ALOGE("%s: IGnssAntennaInfo interface not available.", __func__);
        return JNI_FALSE;
    }

    auto result = gnssAntennaInfoIface->close();
    return checkHidlReturn(result, "IGnssAntennaInfo close() failed.");
    return gnssAntennaInfoIface->close();
}

static jboolean android_location_gnss_hal_GnssNative_is_measurement_supported(JNIEnv* env, jclass) {
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ cc_library_shared {
        "AGnssCallback.cpp",
        "AGnssRil.cpp",
        "AGnssRilCallback.cpp",
        "GnssAntennaInfo.cpp",
        "GnssAntennaInfoCallback.cpp",
        "GnssBatching.cpp",
        "GnssBatchingCallback.cpp",
+77 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Define LOG_TAG before <log/log.h> to overwrite the default value.
#define LOG_TAG "GnssAntennaInfoJni"

#include "GnssAntennaInfo.h"

#include "Utils.h"

using IGnssAntennaInfoAidl = android::hardware::gnss::IGnssAntennaInfo;
using IGnssAntennaInfo_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfo;

namespace android::gnss {

// Implementation of GnssAntennaInfo (AIDL HAL)

GnssAntennaInfoAidl::GnssAntennaInfoAidl(const sp<IGnssAntennaInfoAidl>& iGnssAntennaInfo)
      : mIGnssAntennaInfoAidl(iGnssAntennaInfo) {
    assert(mIGnssAntennaInfoAidl != nullptr);
}

jboolean GnssAntennaInfoAidl::setCallback(
        const std::unique_ptr<GnssAntennaInfoCallback>& callback) {
    auto status = mIGnssAntennaInfoAidl->setCallback(callback->getAidl());
    return checkAidlStatus(status, "IGnssAntennaInfoAidl setCallback() failed.");
}

jboolean GnssAntennaInfoAidl::close() {
    auto status = mIGnssAntennaInfoAidl->close();
    return checkAidlStatus(status, "IGnssAntennaInfoAidl close() failed");
}

// Implementation of GnssAntennaInfo_V2_1

GnssAntennaInfo_V2_1::GnssAntennaInfo_V2_1(const sp<IGnssAntennaInfo_V2_1>& iGnssAntennaInfo)
      : mIGnssAntennaInfo_V2_1(iGnssAntennaInfo) {
    assert(mIGnssAntennaInfo_V2_1 != nullptr);
}

jboolean GnssAntennaInfo_V2_1::setCallback(
        const std::unique_ptr<GnssAntennaInfoCallback>& callback) {
    auto result = mIGnssAntennaInfo_V2_1->setCallback(callback->getV2_1());
    if (!checkHidlReturn(result, "IGnssAntennaInfo_V2_1 setCallback() failed.")) {
        return JNI_FALSE;
    }

    IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus initRet = result;
    if (initRet != IGnssAntennaInfo_V2_1::GnssAntennaInfoStatus::SUCCESS) {
        ALOGE("An error has been found on GnssAntennaInfoInterface::init, status=%d",
              static_cast<int32_t>(initRet));
        return JNI_FALSE;
    } else {
        ALOGD("gnss antenna info v2_1 has been enabled");
    }
    return JNI_TRUE;
}

jboolean GnssAntennaInfo_V2_1::close() {
    auto result = mIGnssAntennaInfo_V2_1->close();
    return checkHidlReturn(result, "IGnssAntennaInfo_V2_1 close() failed.");
}

} // namespace android::gnss
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H
#define _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H

#pragma once

#ifndef LOG_TAG
#error LOG_TAG must be defined before including this file.
#endif

#include <android/hardware/gnss/2.1/IGnssAntennaInfo.h>
#include <android/hardware/gnss/BnGnssAntennaInfo.h>
#include <log/log.h>

#include "GnssAntennaInfoCallback.h"
#include "jni.h"

namespace android::gnss {

class GnssAntennaInfoInterface {
public:
    virtual ~GnssAntennaInfoInterface() {}
    virtual jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) = 0;
    virtual jboolean close() = 0;
};

class GnssAntennaInfoAidl : public GnssAntennaInfoInterface {
public:
    GnssAntennaInfoAidl(const sp<android::hardware::gnss::IGnssAntennaInfo>& iGnssAntennaInfo);
    jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override;
    jboolean close() override;

private:
    const sp<android::hardware::gnss::IGnssAntennaInfo> mIGnssAntennaInfoAidl;
};

class GnssAntennaInfo_V2_1 : public GnssAntennaInfoInterface {
public:
    GnssAntennaInfo_V2_1(
            const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo>& iGnssAntennaInfo);
    jboolean setCallback(const std::unique_ptr<GnssAntennaInfoCallback>& callback) override;
    jboolean close() override;

private:
    const sp<android::hardware::gnss::V2_1::IGnssAntennaInfo> mIGnssAntennaInfo_V2_1;
};

} // namespace android::gnss

#endif // _ANDROID_SERVER_GNSS_GNSSANTENNAINFO_H
+100 −20
Original line number Diff line number Diff line
@@ -25,8 +25,10 @@ namespace android::gnss {
using android::hardware::hidl_vec;
using android::hardware::Return;
using android::hardware::Void;
using binder::Status;

using IGnssAntennaInfoCallback = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback;
using IGnssAntennaInfoCallbackAidl = android::hardware::gnss::IGnssAntennaInfoCallback;
using IGnssAntennaInfoCallback_V2_1 = android::hardware::gnss::V2_1::IGnssAntennaInfoCallback;

namespace {
jclass class_gnssAntennaInfoBuilder;
@@ -92,14 +94,21 @@ void GnssAntennaInfo_class_init_once(JNIEnv* env, jclass& clazz) {
    class_doubleArray = (jclass)env->NewGlobalRef(doubleArrayClass);
}

Return<void> GnssAntennaInfoCallback::gnssAntennaInfoCb(
        const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
    translateAndReportGnssAntennaInfo(gnssAntennaInfos);
binder::Status GnssAntennaInfoCallbackAidl::gnssAntennaInfoCb(
        const std::vector<IGnssAntennaInfoCallbackAidl::GnssAntennaInfo>& gnssAntennaInfos) {
    GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos);
    return Status::ok();
}

Return<void> GnssAntennaInfoCallback_V2_1::gnssAntennaInfoCb(
        const hidl_vec<IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo>& gnssAntennaInfos) {
    GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(gnssAntennaInfos);
    return Void();
}

jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray(
        JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::Row>& array) {
template <template <class...> class T_vector, class T_info>
jobjectArray GnssAntennaInfoCallbackUtil::translate2dDoubleArray(JNIEnv* env,
                                                                 const T_vector<T_info>& array) {
    jsize numRows = array.size();
    if (numRows == 0) {
        // Empty array
@@ -124,8 +133,9 @@ jobjectArray GnssAntennaInfoCallback::translate2dDoubleArray(
    return returnArray;
}

jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos(
        JNIEnv* env, const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
template <template <class...> class T_vector, class T_info>
jobject GnssAntennaInfoCallbackUtil::translateAllGnssAntennaInfos(
        JNIEnv* env, const T_vector<T_info>& gnssAntennaInfos) {
    jobject arrayList = env->NewObject(class_arrayList,
                                       method_arrayListCtor); // Create new ArrayList instance

@@ -141,8 +151,9 @@ jobject GnssAntennaInfoCallback::translateAllGnssAntennaInfos(
    return arrayList;
}

jobject GnssAntennaInfoCallback::translatePhaseCenterOffset(
        JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
template <class T>
jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterOffset(JNIEnv* env,
                                                                const T& gnssAntennaInfo) {
    jobject phaseCenterOffset =
            env->NewObject(class_phaseCenterOffset, method_phaseCenterOffsetCtor,
                           gnssAntennaInfo.phaseCenterOffsetCoordinateMillimeters.x,
@@ -155,8 +166,42 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterOffset(
    return phaseCenterOffset;
}

jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(
        JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
template <>
jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections(
        JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) {
    if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters.empty() ||
        gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters.empty()) {
        return NULL;
    }

    jobjectArray phaseCenterVariationCorrectionsArray =
            translate2dDoubleArray(env, gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters);
    jobjectArray phaseCenterVariationCorrectionsUncertaintiesArray =
            translate2dDoubleArray(env,
                                   gnssAntennaInfo
                                           .phaseCenterVariationCorrectionUncertaintyMillimeters);

    if (phaseCenterVariationCorrectionsArray == NULL ||
        phaseCenterVariationCorrectionsUncertaintiesArray == NULL) {
        env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
        env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);
        return NULL;
    }

    jobject phaseCenterVariationCorrections =
            env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor,
                           phaseCenterVariationCorrectionsArray,
                           phaseCenterVariationCorrectionsUncertaintiesArray);

    env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
    env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);

    return phaseCenterVariationCorrections;
}

template <>
jobject GnssAntennaInfoCallbackUtil::translatePhaseCenterVariationCorrections(
        JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) {
    if (gnssAntennaInfo.phaseCenterVariationCorrectionMillimeters == NULL ||
        gnssAntennaInfo.phaseCenterVariationCorrectionUncertaintyMillimeters == NULL) {
        return NULL;
@@ -171,6 +216,8 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(

    if (phaseCenterVariationCorrectionsArray == NULL ||
        phaseCenterVariationCorrectionsUncertaintiesArray == NULL) {
        env->DeleteLocalRef(phaseCenterVariationCorrectionsArray);
        env->DeleteLocalRef(phaseCenterVariationCorrectionsUncertaintiesArray);
        return NULL;
    }

@@ -185,8 +232,37 @@ jobject GnssAntennaInfoCallback::translatePhaseCenterVariationCorrections(
    return phaseCenterVariationCorrections;
}

jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
        JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
template <>
jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections(
        JNIEnv* env, const IGnssAntennaInfoCallbackAidl::GnssAntennaInfo& gnssAntennaInfo) {
    if (gnssAntennaInfo.signalGainCorrectionDbi.empty() ||
        gnssAntennaInfo.signalGainCorrectionUncertaintyDbi.empty()) {
        return NULL;
    }
    jobjectArray signalGainCorrectionsArray =
            translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionDbi);
    jobjectArray signalGainCorrectionsUncertaintiesArray =
            translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi);

    if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) {
        env->DeleteLocalRef(signalGainCorrectionsArray);
        env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);
        return NULL;
    }

    jobject signalGainCorrections =
            env->NewObject(class_sphericalCorrections, method_sphericalCorrectionsCtor,
                           signalGainCorrectionsArray, signalGainCorrectionsUncertaintiesArray);

    env->DeleteLocalRef(signalGainCorrectionsArray);
    env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);

    return signalGainCorrections;
}

template <>
jobject GnssAntennaInfoCallbackUtil::translateSignalGainCorrections(
        JNIEnv* env, const IGnssAntennaInfoCallback_V2_1::GnssAntennaInfo& gnssAntennaInfo) {
    if (gnssAntennaInfo.signalGainCorrectionDbi == NULL ||
        gnssAntennaInfo.signalGainCorrectionUncertaintyDbi == NULL) {
        return NULL;
@@ -197,6 +273,8 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
            translate2dDoubleArray(env, gnssAntennaInfo.signalGainCorrectionUncertaintyDbi);

    if (signalGainCorrectionsArray == NULL || signalGainCorrectionsUncertaintiesArray == NULL) {
        env->DeleteLocalRef(signalGainCorrectionsArray);
        env->DeleteLocalRef(signalGainCorrectionsUncertaintiesArray);
        return NULL;
    }

@@ -210,8 +288,9 @@ jobject GnssAntennaInfoCallback::translateSignalGainCorrections(
    return signalGainCorrections;
}

jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
        JNIEnv* env, const IGnssAntennaInfoCallback::GnssAntennaInfo& gnssAntennaInfo) {
template <class T>
jobject GnssAntennaInfoCallbackUtil::translateSingleGnssAntennaInfo(JNIEnv* env,
                                                                    const T& gnssAntennaInfo) {
    jobject phaseCenterOffset = translatePhaseCenterOffset(env, gnssAntennaInfo);

    // Nullable
@@ -228,7 +307,7 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
    // Set fields
    callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
                                   method_gnssAntennaInfoBuilderSetCarrierFrequencyMHz,
                                   gnssAntennaInfo.carrierFrequencyMHz);
                                   getCarrierFrequencyMHz(gnssAntennaInfo));
    callObjectMethodIgnoringResult(env, gnssAntennaInfoBuilderObject,
                                   method_gnssAntennaInfoBuilderSetPhaseCenterOffset,
                                   phaseCenterOffset);
@@ -251,8 +330,9 @@ jobject GnssAntennaInfoCallback::translateSingleGnssAntennaInfo(
    return gnssAntennaInfoObject;
}

void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo(
        const hidl_vec<IGnssAntennaInfoCallback::GnssAntennaInfo>& gnssAntennaInfos) {
template <template <class...> class T_vector, class T_info>
void GnssAntennaInfoCallbackUtil::translateAndReportGnssAntennaInfo(
        const T_vector<T_info>& gnssAntennaInfos) {
    JNIEnv* env = getJniEnv();

    jobject arrayList = translateAllGnssAntennaInfos(env, gnssAntennaInfos);
@@ -262,7 +342,7 @@ void GnssAntennaInfoCallback::translateAndReportGnssAntennaInfo(
    env->DeleteLocalRef(arrayList);
}

void GnssAntennaInfoCallback::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) {
void GnssAntennaInfoCallbackUtil::reportAntennaInfo(JNIEnv* env, const jobject antennaInfosArray) {
    env->CallVoidMethod(mCallbacksObj, method_reportAntennaInfo, antennaInfosArray);
    checkAndClearExceptionFromCallback(env, __FUNCTION__);
}
Loading