15 #include <unordered_map> 20 #define TTV_JNI_RETURN_ON_NULL(jni,ptr,err) { if ( (ptr) == nullptr) { ASSERT_ON_ERROR(err); return GetJavaInstance_ErrorCode(jni, err); } } 21 #define TTV_JNI_RETURN_ON_NOT_NULL(jni,ptr,err) { if ( (ptr) != nullptr) { ASSERT_ON_ERROR(err); return GetJavaInstance_ErrorCode(jni, err); } } 22 #define TTV_JNI_RETURN_ON_FALSE(jni,val,err) { if (!val) { return GetJavaInstance_ErrorCode(jni, err); } } 26 #define AUTO_DELETE_LOCAL_REF(JENV, TYPE, VAR, VALUE) \ 27 TYPE VAR = static_cast<TYPE>(VALUE); \ 28 JavaLocalReferenceDeleter VAR##_Deleter(JENV, VAR, #VAR); 30 #define AUTO_DELETE_LOCAL_REF_NO_DECLARE(JENV, TYPE, VAR) \ 31 JavaLocalReferenceDeleter VAR##_Deleter(JENV, VAR, #VAR); 43 class JavaLocalReferenceDeleter;
44 class ScopedJavaUTFStringConverter;
45 class ScopedJavaWcharStringConverter;
46 class ScopedJavaEnvironmentCacher;
48 class GlobalJavaObjectReference;
50 template <
typename PROXY_TYPE>
53 template <
typename PROXY_TYPE,
typename LISTENER_TYPE>
56 template <
typename NativeInstanceType,
typename ContextType>
112 template<
typename... ArgTypes>
115 template <
typename ContainerType,
typename KVTransformerType>
116 jobject
GetJavaInstance_HashMap(JNIEnv* jEnv,
const ContainerType& container,
const KVTransformerType& transformer);
118 template <
typename T>
121 template <
typename T>
147 const char* GetNativeString();
151 operator const char*() {
return GetNativeString(); }
152 operator std::string() {
return GetNativeString(); }
168 const wchar_t* GetNativeString()
const;
184 static int GetMinLocalReferenceTableCapacity();
203 JNIEnv* operator->();
225 bool Bind(JNIEnv* jEnv, jobject jLocalObject);
236 template <
typename PROXY_TYPE>
242 template <
typename PROXY_TYPE,
typename LISTENER_TYPE>
253 template <
typename NativeInstanceType,
typename ContextType>
257 void Register(
const std::shared_ptr<NativeInstanceType>& nativeInstance,
const std::shared_ptr<ContextType>& nativeContext, jobject javaInstance)
259 if (mMutex ==
nullptr)
266 auto entry = std::make_shared<Entry>();
267 entry->nativeInstance = nativeInstance;
268 entry->nativeContext = nativeContext;
269 entry->javaInstance.Bind(jEnv, javaInstance);
272 mRegistry.push_back(entry);
277 Unregister(reinterpret_cast<NativeInstanceType*>(jNativePointer));
282 if (mMutex ==
nullptr)
289 for (
auto iter = mRegistry.begin(); iter != mRegistry.end(); ++iter)
293 if (entry->nativeInstance.get() == nativeInstance)
295 mRegistry.erase(iter);
303 if (mMutex ==
nullptr)
311 for (
auto iter = mRegistry.begin(); iter != mRegistry.end(); ++iter)
315 if (jEnv->IsSameObject(javaInstance, entry->javaInstance.GetInstance()))
317 mRegistry.erase(iter);
328 if (mMutex ==
nullptr)
336 for (
const auto& entry : mRegistry)
338 if (jEnv->IsSameObject(javaInstance, entry->javaInstance.GetInstance()))
340 return entry->nativeInstance;
349 if (mMutex ==
nullptr)
357 for (
const auto& entry : mRegistry)
359 if (jEnv->IsSameObject(javaInstance, entry->javaInstance.GetInstance()))
361 return entry->nativeContext;
370 if (mMutex ==
nullptr)
378 for (
const auto& entry : mRegistry)
380 if (reinterpret_cast<NativeInstanceType*>(nativeInstance) == entry->nativeInstance.get())
382 return entry->nativeContext;
405 std::unordered_map<std::string, jmethodID>
methods;
407 std::unordered_map<std::string, jfieldID>
fields;
411 template<
typename... ArgTypes>
414 auto callbackReference = std::make_shared<GlobalJavaObjectReference>();
415 callbackReference->Bind(jEnv, jCallback);
419 return [callbackReference, &callbackInfo](ArgTypes... args)
421 auto callback = callbackReference->GetInstance();
423 if (callback !=
nullptr)
431 template <
typename ContainerType,
typename KVTransformerType>
435 jobject jHashMap = jEnv->NewObject(hashMapInfo.
klass, hashMapInfo.
methods[
"<init>"]);
437 for (
const auto& pair : container)
439 auto jPair = transformer(pair);
443 jEnv->CallObjectMethod(jHashMap, hashMapInfo.
methods[
"put"], jKey, jValue);
450 template <
typename T>
453 return jEnv->CallStaticObjectMethod(info.
klass, info.
staticMethods[
"lookupValue"], static_cast<jint>(val));
457 template <
typename T>
460 if (jEnumValue ==
nullptr)
465 return static_cast<T
>( jEnv->CallIntMethod(jEnumValue, info.
methods[
"getValue"]) );
jstring mJavaString
Definition: java_utility.h:156
jobjectArray GetJavaInstance_Array(JNIEnv *jEnv, JavaClassInfo &javaArrayTypeClassInfo, const uint32_t size, std::function< jobject(uint32_t index)> entryFunc)
void Unregister(NativeInstanceType *nativeInstance)
Definition: java_utility.h:280
jobject mObject
Definition: java_utility.h:232
void GetNativeInstance_HttpRequestResult(JNIEnv *jEnv, jobject jRequestResult, uint &statusCode, std::map< std::string, std::string > &resultHeaders, std::vector< char > &response)
int GetCharacterLength() const
Definition: java_utility.h:148
jobject GetJavaInstance_Double(JNIEnv *jEnv, double value)
const char * mNativeString
Definition: java_utility.h:157
void Unregister(jobject javaInstance)
Definition: java_utility.h:301
JavaVM * gGlobalJavaVirtualMachine
The Java virtual machine.
jobject GetJavaInstance_GetResultFromResultContainer(JNIEnv *jEnv, jobject jResultContainer)
bool LookupJavaClass(JNIEnv *jEnv, JavaClassInfo &info, const char *klass)
void Unregister(jlong jNativePointer)
Definition: java_utility.h:275
Definition: errortypes.h:267
bool CacheJavaVirtualMachine(JNIEnv *jEnv)
void SetResultContainerResult(JNIEnv *jEnv, jobject jResultContainer, jobject jResult)
JavaClassInfo & GetJavaClassInfo_Integer(JNIEnv *jEnv)
std::unordered_map< std::string, jfieldID > fields
Definition: java_utility.h:407
bool LookupJavaStaticMethod(JNIEnv *jEnv, JavaClassInfo &info, const char *method, const char *signature)
JavaClassInfo & GetJavaClassInfo_Charset(JNIEnv *jEnv)
std::unordered_map< std::string, jmethodID > methods
Definition: java_utility.h:405
Definition: java_utility.h:402
Definition: java_utility.h:54
void LoadAllUtilityJavaClassInfo(JNIEnv *jEnv)
jobjectArray GetJavaInstance_StringArray(JNIEnv *jEnv, const std::vector< std::string > &arr)
Definition: java_utility.h:390
jobject GetJavaInstance_Boolean(JNIEnv *jEnv, bool value)
JavaLocalReferenceDeleter(JNIEnv *jEnv, jobject jObject, const char *name)
Definition: java_utility.h:128
jstring GetJavaInstance_StringWithEncoding(JNIEnv *jEnv, const std::string &str)
bool mNeedsDetach
Definition: java_utility.h:212
jobject GetJavaInstance_ErrorCode(JNIEnv *jEnv, TTV_ErrorCode err)
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
void Register(const std::shared_ptr< NativeInstanceType > &nativeInstance, const std::shared_ptr< ContextType > &nativeContext, jobject javaInstance)
Definition: java_utility.h:257
std::shared_ptr< ContextType > nativeContext
Definition: java_utility.h:393
#define AUTO_DELETE_LOCAL_REF(JENV, TYPE, VAR, VALUE)
Definition: java_utility.h:26
std::unordered_map< std::string, jmethodID > staticMethods
Definition: java_utility.h:406
std::wstring mSTDWideString
Definition: java_utility.h:174
static int mCacheCount
Definition: java_utility.h:187
bool LookupJavaMethod(JNIEnv *jEnv, JavaClassInfo &info, const char *method, const char *signature)
std::shared_ptr< NativeInstanceType > LookupNativeInstance(jobject javaInstance)
Definition: java_utility.h:326
JavaClassInfo & GetJavaClassInfo_String(JNIEnv *jEnv)
Definition: java_utility.h:141
int mCharacterLength
Definition: java_utility.h:158
jclass klass
Definition: java_utility.h:404
std::vector< std::shared_ptr< Entry > > mRegistry
Definition: java_utility.h:397
std::shared_ptr< ttv::IMutex > mMutex
Definition: java_utility.h:398
jobject GetJavaInstance_HashMap(JNIEnv *jEnv, const ContainerType &container, const KVTransformerType &transformer)
Definition: java_utility.h:432
jstring GetJavaInstance_String(JNIEnv *jEnv, const char *str)
TTV_ErrorCode CreateMutex(std::shared_ptr< IMutex > &result)
jstring mJavaString
Definition: java_utility.h:172
jobject GetJavaInstance_Float(JNIEnv *jEnv, float value)
const wchar_t * mNativeString
Definition: java_utility.h:173
std::function< void(ArgTypes...)> CreateJavaCallbackWrapper(JNIEnv *jEnv, jobject jCallback, JavaClassInfo &callbackInfo)
Definition: java_utility.h:412
uint32_t TTV_ErrorCode
Definition: errortypes.h:30
JNIEnv * mJEnv
Definition: java_utility.h:211
jbyteArray GetInstanceAsByteArray() const
Definition: java_utility.h:229
std::shared_ptr< NativeInstanceType > nativeInstance
Definition: java_utility.h:392
jobject mObject
Definition: java_utility.h:136
JavaClassInfo & GetJavaClassInfo_Double(JNIEnv *jEnv)
unsigned int uint
Definition: coretypes.h:18
T GetNativeFromJava_SimpleEnum(JNIEnv *jEnv, JavaClassInfo &info, jobject jEnumValue, T defaultValue)
Definition: java_utility.h:458
const char * mName
Definition: java_utility.h:137
std::shared_ptr< PROXY_TYPE > instance
Definition: java_utility.h:245
JNIEnv * mjEnv
Definition: java_utility.h:171
JavaClassInfo & GetJavaClassInfo_HashSet(JNIEnv *jEnv)
JavaVM * GetJvm()
Definition: java_utility.h:201
JNIEnv * mjEnv
Definition: java_utility.h:155
JavaVM * mJvm
Definition: java_utility.h:210
void GetNativeInstance_StringVector(JNIEnv *jEnv, jobjectArray jArray, std::vector< std::string > &result)
std::shared_ptr< LISTENER_TYPE > nativeListener
Definition: java_utility.h:246
Definition: java_utility.h:194
jobject GetJavaInstance_EnumValue(JNIEnv *jEnv, const ttv::EnumValue &value)
JNIEnv * gActiveJavaEnvironment
This is cached on every call into native code so that it's current. Never use from another thread...
Definition: java_utility.h:163
bool LookupJavaField(JNIEnv *jEnv, JavaClassInfo &info, const char *field, const char *signature)
JavaClassInfo & GetJavaClassInfo_Long(JNIEnv *jEnv)
JavaClassInfo & GetJavaClassInfo_HashMap(JNIEnv *jEnv)
Definition: java_utility.h:178
Definition: java_utility.h:57
jobjectArray GetJavaInstance_EnumValueArray(JNIEnv *jEnv, const std::vector< ttv::EnumValue > &arr)
jobject GetJavaInstance_SimpleEnum(JNIEnv *jEnv, JavaClassInfo &info, T val)
Definition: java_utility.h:451
jobject GetJavaInstance_Long(JNIEnv *jEnv, uint64_t value)
jobject GetInstance() const
Definition: java_utility.h:228
jobject GetJavaInstance_StringHashMap(JNIEnv *jEnv, const std::map< std::string, std::string > &map)
int GetByteLength() const
Definition: java_utility.h:149
JNIEnv * mjEnv
Definition: java_utility.h:135
std::shared_ptr< ContextType > LookupNativeContext(jlong nativeInstance)
Definition: java_utility.h:368
JavaClassInfo & GetJavaClassInfo_Float(JNIEnv *jEnv)
GlobalJavaObjectReference javaInstance
Definition: java_utility.h:394
std::shared_ptr< PROXY_TYPE > instance
Definition: java_utility.h:239
std::shared_ptr< ContextType > LookupNativeContext(jobject javaInstance)
Definition: java_utility.h:347
int mByteLength
Definition: java_utility.h:159
JavaClassInfo & GetJavaClassInfo_Boolean(JNIEnv *jEnv)
jobject GetJavaInstance_ResultContainer(JNIEnv *jEnv)
void GetNativeFromJava_ByteArray(JNIEnv *jEnv, jbyteArray jSource, std::vector< uint8_t > &dest)
~JavaLocalReferenceDeleter()
Definition: java_utility.h:216
Definition: java_utility.h:51
jobject GetJavaInstance_Integer(JNIEnv *jEnv, int32_t value)