Skip to content

Commit

Permalink
Add ability to get private field value
Browse files Browse the repository at this point in the history
  • Loading branch information
terrysahaidak committed Oct 24, 2019
1 parent 3d83a0a commit 915e38e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 6 deletions.
6 changes: 5 additions & 1 deletion App.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,11 @@ const App: () => React$Node = () => {
<View style={styles.sectionContainer}>
<Text style={styles.sectionTitle}>
{/* this is from C++ JSI bindings */}
{global.NativeSampleModule.runTest()}
{global.NativeSampleModule.getStaticField()}
</Text>
<Text style={styles.sectionTitle}>
{/* this is from C++ JSI bindings */}
{global.NativeSampleModule.getStringPrivateField()}
</Text>
</View>
</View>
Expand Down
42 changes: 38 additions & 4 deletions libs/android-jsi/test-jsi/src/main/cpp/TestJSIInstaller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,13 @@

#include "TestJSIInstaller.h"

// global ref to Java Virtual Machine
// used to get JNI current env
JavaVM *jvm;
// global ref to our class instance
static jobject globalObjectRef;
// global ref to our class
static jclass globalClassRef;

extern "C" JNIEXPORT void JNICALL
Java_com_terrysahaidak_test_jsi_TestJSIInstaller_installBinding(JNIEnv *env, jobject thiz, jlong runtimePtr)
Expand All @@ -13,7 +19,14 @@ Java_com_terrysahaidak_test_jsi_TestJSIInstaller_installBinding(JNIEnv *env, job

SampleModule::install(runtime, testBinding);

// storring java vm reference
env->GetJavaVM(&jvm);

globalObjectRef = env->NewGlobalRef(thiz);

auto clazz = env->FindClass("com/terrysahaidak/test/jsi/TestJSIInstaller");

globalClassRef = (jclass)env->NewGlobalRef(clazz);
}

JNIEnv *attachCurrentThread()
Expand All @@ -40,7 +53,29 @@ jsi::Value SampleModule::get(
{
auto methodName = name.utf8(runtime);

if (methodName == "runTest")
if (methodName == "getStaticField")
{
return jsi::Function::createFromHostFunction(
runtime,
name,
0,
[](
jsi::Runtime &runtime,
const jsi::Value &thisValue,
const jsi::Value *arguments,
size_t count) -> jsi::Value {
auto env = attachCurrentThread();

auto runTest = env->GetStaticMethodID(globalClassRef, "runTest", "()Ljava/lang/String;");
auto str = (jstring)env->CallStaticObjectMethod(globalClassRef, runTest);

const char *cStr = env->GetStringUTFChars(str, nullptr);

return jsi::String::createFromAscii(runtime, cStr);
});
}

if (methodName == "getStringPrivateField")
{
return jsi::Function::createFromHostFunction(
runtime,
Expand All @@ -53,10 +88,9 @@ jsi::Value SampleModule::get(
size_t count) -> jsi::Value {
auto env = attachCurrentThread();

auto clazz = env->FindClass("com/terrysahaidak/test/jsi/TestJSIInstaller");
auto valId = env->GetFieldID(globalClassRef, "stringField", "Ljava/lang/String;");

auto runTest = env->GetStaticMethodID(clazz, "runTest", "()Ljava/lang/String;");
auto str = (jstring)env->CallStaticObjectMethod(clazz, runTest);
auto str = (jstring)env->GetObjectField(globalObjectRef, valId);

const char *cStr = env->GetStringUTFChars(str, nullptr);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
public class TestJSIInstaller {
public native void installBinding(long javaScriptContextHolder);

private String stringField = "Private field value";

static {
System.loadLibrary("test-jsi");
}

public static String runTest() {
return "Hello from Java via JNI+JSI";
return "Static field value";
}
}

0 comments on commit 915e38e

Please sign in to comment.