Skip to content

Instantly share code, notes, and snippets.

@gauravssnl
Last active November 13, 2024 20:57
Show Gist options
  • Save gauravssnl/fe0c217e0ca42bb01b59cc93c417973e to your computer and use it in GitHub Desktop.
Save gauravssnl/fe0c217e0ca42bb01b59cc93c417973e to your computer and use it in GitHub Desktop.

Revisions

  1. gauravssnl revised this gist Nov 13, 2024. 2 changed files with 10 additions and 2 deletions.
    4 changes: 4 additions & 0 deletions Test.java
    Original file line number Diff line number Diff line change
    @@ -5,9 +5,13 @@ class Test {

    public static void main(String[] args) {
    System.out.println("Test OK");
    System.out.println(stringFromJNI());
    }

    public static String message() {
    return "Hello from Java";
    }

    public native static String stringFromJNI();

    }
    8 changes: 6 additions & 2 deletions hello.cpp
    Original file line number Diff line number Diff line change
    @@ -2,8 +2,7 @@

    void println_java(JNIEnv *env, const char *msg);

    // extern "C" [[gnu::visibility("default")]] [[gnu::used]]
    jint JNI_OnLoad(JavaVM *jvm, void *) {
    extern "C" jint JNI_OnLoad(JavaVM *jvm, void *) {
    JNIEnv *env = nullptr;
    jvm->GetEnv((void **)&env, JNI_VERSION_1_6);
    println_java(env, "Hello from JNI!");
    @@ -24,3 +23,8 @@ void println_java(JNIEnv *env, const char *msg) {
    jstring str = env->NewStringUTF(msg);
    env->CallVoidMethod(out, mid, str);
    }

    extern "C" JNIEXPORT jstring JNICALL Java_Test_stringFromJNI(JNIEnv *env,
    jobject thiz) {
    return env->NewStringUTF("Hello String from JNI");
    }
  2. gauravssnl created this gist Nov 13, 2024.
    13 changes: 13 additions & 0 deletions Test.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    class Test {
    static {
    System.loadLibrary("hello");
    }

    public static void main(String[] args) {
    System.out.println("Test OK");
    }

    public static String message() {
    return "Hello from Java";
    }
    }
    26 changes: 26 additions & 0 deletions hello.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,26 @@
    #include "jni.h"

    void println_java(JNIEnv *env, const char *msg);

    // extern "C" [[gnu::visibility("default")]] [[gnu::used]]
    jint JNI_OnLoad(JavaVM *jvm, void *) {
    JNIEnv *env = nullptr;
    jvm->GetEnv((void **)&env, JNI_VERSION_1_6);
    println_java(env, "Hello from JNI!");
    return JNI_VERSION_1_6;
    }

    void println_java(JNIEnv *env, const char *msg) {
    // Get system class
    jclass syscls = env->FindClass("java/lang/System");
    // Lookup the "out" field
    jfieldID fid = env->GetStaticFieldID(syscls, "out", "Ljava/io/PrintStream;");
    jobject out = env->GetStaticObjectField(syscls, fid);
    // Get PrintStream class
    jclass pscls = env->FindClass("java/io/PrintStream");
    // Lookup printLn(String)
    jmethodID mid = env->GetMethodID(pscls, "println", "(Ljava/lang/String;)V");
    // Invoke the method
    jstring str = env->NewStringUTF(msg);
    env->CallVoidMethod(out, mid, str);
    }
    3 changes: 3 additions & 0 deletions run.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,3 @@
    export CPLUS_INCLUDE_PATH="$JAVA_HOME/include:$JAVA_HOME/include/linux"
    clang hello.cpp -shared -o libhello.so
    javac Test.java && java -Djava.library.path=. Test