Skip to content

Commit

Permalink
Enable Java CHIP classes to be loaded from any thread (#7831)
Browse files Browse the repository at this point in the history
* Convert JniReferences to namespace

* Cache classloader in SetJavaVm() and use it in GetClassRef()

* Generate
  • Loading branch information
austinh0 authored and pull[bot] committed Jul 9, 2021
1 parent 8e33de6 commit 3557369
Show file tree
Hide file tree
Showing 7 changed files with 879 additions and 808 deletions.
9 changes: 5 additions & 4 deletions src/controller/java/AndroidDeviceControllerWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,28 +25,29 @@
#include <platform/KeyValueStoreManager.h>
#include <support/ThreadOperationalDataset.h>

using chip::Controller::DeviceCommissioner;
using namespace chip::Controller;

extern chip::Ble::BleLayer * GetJNIBleLayer();

AndroidDeviceControllerWrapper::~AndroidDeviceControllerWrapper()
{
if ((mJavaVM != nullptr) && (mJavaObjectRef != nullptr))
{
JniReferences::GetEnvForCurrentThread()->DeleteGlobalRef(mJavaObjectRef);
JniReferences::GetInstance().GetEnvForCurrentThread()->DeleteGlobalRef(mJavaObjectRef);
}
mController->Shutdown();
}

void AndroidDeviceControllerWrapper::SetJavaObjectRef(JavaVM * vm, jobject obj)
{
mJavaVM = vm;
mJavaObjectRef = JniReferences::GetEnvForCurrentThread()->NewGlobalRef(obj);
mJavaObjectRef = JniReferences::GetInstance().GetEnvForCurrentThread()->NewGlobalRef(obj);
}

void AndroidDeviceControllerWrapper::CallJavaMethod(const char * methodName, jint argument)
{
CallVoidInt(JniReferences::GetEnvForCurrentThread(), mJavaObjectRef, methodName, argument);
JniReferences::GetInstance().CallVoidInt(JniReferences::GetInstance().GetEnvForCurrentThread(), mJavaObjectRef, methodName,
argument);
}

AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew(JavaVM * vm, jobject deviceControllerObj,
Expand Down
11 changes: 7 additions & 4 deletions src/controller/java/AndroidKeyValueStoreManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
#include <support/CodeUtils.h>
#include <support/logging/CHIPLogging.h>

using namespace chip::Controller;

namespace chip {
namespace DeviceLayer {
namespace PersistedStorage {
Expand All @@ -47,7 +49,7 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t
ReturnErrorCodeIf(mGetMethod == nullptr, CHIP_ERROR_INCORRECT_STATE);
ReturnErrorCodeIf(offset != 0, CHIP_ERROR_INVALID_ARGUMENT);

JNIEnv * env = JniReferences::GetEnvForCurrentThread();
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
ReturnErrorCodeIf(env == nullptr, CHIP_ERROR_INTERNAL);

UtfString javaKey(env, key);
Expand Down Expand Up @@ -100,7 +102,7 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Delete(const char * key)
ReturnErrorCodeIf(mKeyValueStoreManagerClass == nullptr, CHIP_ERROR_INCORRECT_STATE);
ReturnErrorCodeIf(mDeleteMethod == nullptr, CHIP_ERROR_INCORRECT_STATE);

JNIEnv * env = JniReferences::GetEnvForCurrentThread();
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
ReturnErrorCodeIf(env == nullptr, CHIP_ERROR_INTERNAL);

UtfString javaKey(env, key);
Expand All @@ -124,7 +126,7 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value,
ReturnErrorCodeIf(mSetMethod == nullptr, CHIP_ERROR_INCORRECT_STATE);
ReturnErrorCodeIf(value_size > kMaxKvsValueBytes, CHIP_ERROR_INVALID_ARGUMENT);

JNIEnv * env = JniReferences::GetEnvForCurrentThread();
JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread();
ReturnErrorCodeIf(env == nullptr, CHIP_ERROR_INTERNAL);

std::unique_ptr<char[]> buffer(new char[BASE64_ENCODED_LEN(value_size) + 1]);
Expand Down Expand Up @@ -152,7 +154,8 @@ void KeyValueStoreManagerImpl::InitializeMethodForward(JavaVM * vm, JNIEnv * env
{
mJvm = vm;

CHIP_ERROR err = GetClassRef(env, "chip/devicecontroller/KeyValueStoreManager", mKeyValueStoreManagerClass);
CHIP_ERROR err =
JniReferences::GetInstance().GetClassRef(env, "chip/devicecontroller/KeyValueStoreManager", mKeyValueStoreManagerClass);
if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "Failed to get reference to KeyValueStoreManager");
Expand Down
Loading

0 comments on commit 3557369

Please sign in to comment.