Loading jni/com_android_bluetooth_btservice_ActivityAttribution.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ using bluetooth::activity_attribution::ActivityAttributionInterface; namespace android { static jmethodID method_onWakeup; static jmethodID method_onActivityLogsReady; static ActivityAttributionInterface* sActivityAttributionInterface = nullptr; static std::shared_timed_mutex interface_mutex; Loading Loading @@ -60,12 +61,37 @@ class ActivityAttributionCallbacksImpl : public ActivityAttributionCallbacks { sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWakeup, (jint)activity, addr.get()); } void OnActivityLogsReady( const std::vector<BtaaAggregationEntry> logs) override { LOG(INFO) << __func__; std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex); CallbackEnv sCallbackEnv(__func__); if (!sCallbackEnv.valid() || mCallbacksObj == nullptr) return; jsize logs_size = logs.size() * sizeof(BtaaAggregationEntry); ScopedLocalRef<jbyteArray> addr(sCallbackEnv.get(), sCallbackEnv->NewByteArray(logs_size)); if (!addr.get()) { LOG(ERROR) << "Failed to allocate jbyteArray for logs from activity " "logging callback"; return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, logs_size, (jbyte*)logs.data()); sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onActivityLogsReady, addr.get()); } }; static ActivityAttributionCallbacksImpl sActivityAttributionCallbacks; static void classInitNative(JNIEnv* env, jclass clazz) { method_onWakeup = env->GetMethodID(clazz, "onWakeup", "(I[B)V"); method_onActivityLogsReady = env->GetMethodID(clazz, "onActivityLogsReady", "([B)V"); LOG(INFO) << __func__ << ": succeeds"; } Loading src/com/android/bluetooth/btservice/activityAttribution/ActivityAttributionNativeInterface.java +4 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,10 @@ public class ActivityAttributionNativeInterface { Log.i(TAG, "onWakeup() BTAA: " + activity); } private void onActivityLogsReady(byte[] logs) { Log.i(TAG, "onActivityLogsReady() BTAA: " + logs); } // Native methods that call into the JNI interface private static native void classInitNative(); Loading Loading
jni/com_android_bluetooth_btservice_ActivityAttribution.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ using bluetooth::activity_attribution::ActivityAttributionInterface; namespace android { static jmethodID method_onWakeup; static jmethodID method_onActivityLogsReady; static ActivityAttributionInterface* sActivityAttributionInterface = nullptr; static std::shared_timed_mutex interface_mutex; Loading Loading @@ -60,12 +61,37 @@ class ActivityAttributionCallbacksImpl : public ActivityAttributionCallbacks { sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onWakeup, (jint)activity, addr.get()); } void OnActivityLogsReady( const std::vector<BtaaAggregationEntry> logs) override { LOG(INFO) << __func__; std::shared_lock<std::shared_timed_mutex> lock(callbacks_mutex); CallbackEnv sCallbackEnv(__func__); if (!sCallbackEnv.valid() || mCallbacksObj == nullptr) return; jsize logs_size = logs.size() * sizeof(BtaaAggregationEntry); ScopedLocalRef<jbyteArray> addr(sCallbackEnv.get(), sCallbackEnv->NewByteArray(logs_size)); if (!addr.get()) { LOG(ERROR) << "Failed to allocate jbyteArray for logs from activity " "logging callback"; return; } sCallbackEnv->SetByteArrayRegion(addr.get(), 0, logs_size, (jbyte*)logs.data()); sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onActivityLogsReady, addr.get()); } }; static ActivityAttributionCallbacksImpl sActivityAttributionCallbacks; static void classInitNative(JNIEnv* env, jclass clazz) { method_onWakeup = env->GetMethodID(clazz, "onWakeup", "(I[B)V"); method_onActivityLogsReady = env->GetMethodID(clazz, "onActivityLogsReady", "([B)V"); LOG(INFO) << __func__ << ": succeeds"; } Loading
src/com/android/bluetooth/btservice/activityAttribution/ActivityAttributionNativeInterface.java +4 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,10 @@ public class ActivityAttributionNativeInterface { Log.i(TAG, "onWakeup() BTAA: " + activity); } private void onActivityLogsReady(byte[] logs) { Log.i(TAG, "onActivityLogsReady() BTAA: " + logs); } // Native methods that call into the JNI interface private static native void classInitNative(); Loading