From af62dfc6f3312c628bf851b7724c5925c1e839e9 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 17 Apr 2019 18:11:13 +0200 Subject: make JNI work --- .../androidTest/kotlin/InstrumentedAkonoTests.kt | 6 +++ library/src/main/cpp/CMakeLists.txt | 36 ++++++++++++-- library/src/main/cpp/akono-jni.c | 47 ------------------ library/src/main/cpp/akono-jni.cpp | 58 ++++++++++++++++++++++ library/src/main/kotlin/akono/AkoniJni.kt | 12 +++-- 5 files changed, 102 insertions(+), 57 deletions(-) delete mode 100644 library/src/main/cpp/akono-jni.c create mode 100644 library/src/main/cpp/akono-jni.cpp (limited to 'library/src') diff --git a/library/src/androidTest/kotlin/InstrumentedAkonoTests.kt b/library/src/androidTest/kotlin/InstrumentedAkonoTests.kt index b5ea0111..6a59d0ef 100644 --- a/library/src/androidTest/kotlin/InstrumentedAkonoTests.kt +++ b/library/src/androidTest/kotlin/InstrumentedAkonoTests.kt @@ -18,4 +18,10 @@ public class InstrumentedAkonoTestOne { val ajni: AkonoJni = AkonoJni() assertEquals("foo", ajni.stringFromJNI()) } + + @Test + fun myJsTest() { + val ajni: AkonoJni = AkonoJni() + assertEquals("2", ajni.evalJs("1+1")); + } } diff --git a/library/src/main/cpp/CMakeLists.txt b/library/src/main/cpp/CMakeLists.txt index b2983d0b..b101f4bf 100644 --- a/library/src/main/cpp/CMakeLists.txt +++ b/library/src/main/cpp/CMakeLists.txt @@ -1,15 +1,41 @@ cmake_minimum_required(VERSION 3.4.1) -add_library(akono-jni SHARED - akono-jni.c) +add_library( + akono-jni SHARED + akono-jni.cpp +) + +set(deps_dir ${CMAKE_CURRENT_SOURCE_DIR}/../../../../deps) + +if(NOT EXISTS ${deps_dir}) + message( FATAL_ERROR "Dependency directory does not exist") +endif() + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") + +include_directories( + ${deps_dir}/node/src + ${deps_dir}/node/deps/v8/include +) + +add_library(node SHARED IMPORTED) +set_target_properties(node PROPERTIES IMPORTED_LOCATION + ${deps_dir}/compiled/${ANDROID_ABI}/libnode.so) add_library(v8 STATIC IMPORTED) set_target_properties(v8 PROPERTIES IMPORTED_LOCATION - ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so) + ${deps_dir}/compiled/${ANDROID_ABI}/libv8.cr.so) +add_library(v8_platform STATIC IMPORTED) +set_target_properties(v8_platform PROPERTIES IMPORTED_LOCATION + ${deps_dir}/compiled/${ANDROID_ABI}/libv8_libplatform.cr.so) # Include libraries needed for hello-jni lib target_link_libraries(akono-jni - android - log) + v8 + v8_platform + node + android + log) + diff --git a/library/src/main/cpp/akono-jni.c b/library/src/main/cpp/akono-jni.c deleted file mode 100644 index 49777431..00000000 --- a/library/src/main/cpp/akono-jni.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include - -/* This is a trivial JNI example where we use a native method - * to return a new VM String. See the corresponding Java source - * file located at: - * - * hello-jni/app/src/main/java/com/example/hellojni/HelloJni.java - */ -JNIEXPORT jstring JNICALL -Java_akono_AkonoJni_stringFromJNI( JNIEnv* env, - jobject thiz ) -{ -#if defined(__arm__) - #if defined(__ARM_ARCH_7A__) - #if defined(__ARM_NEON__) - #if defined(__ARM_PCS_VFP) - #define ABI "armeabi-v7a/NEON (hard-float)" - #else - #define ABI "armeabi-v7a/NEON" - #endif - #else - #if defined(__ARM_PCS_VFP) - #define ABI "armeabi-v7a (hard-float)" - #else - #define ABI "armeabi-v7a" - #endif - #endif - #else - #define ABI "armeabi" - #endif -#elif defined(__i386__) -#define ABI "x86" -#elif defined(__x86_64__) -#define ABI "x86_64" -#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ -#define ABI "mips64" -#elif defined(__mips__) -#define ABI "mips" -#elif defined(__aarch64__) -#define ABI "arm64-v8a" -#else -#define ABI "unknown" -#endif - - return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI "."); -} diff --git a/library/src/main/cpp/akono-jni.cpp b/library/src/main/cpp/akono-jni.cpp new file mode 100644 index 00000000..2131e0eb --- /dev/null +++ b/library/src/main/cpp/akono-jni.cpp @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +/* This is a trivial JNI example where we use a native method + * to return a new VM String. See the corresponding Java source + * file located at: + * + * hello-jni/app/src/main/java/com/example/hellojni/HelloJni.java + */ +extern "C" JNIEXPORT jstring JNICALL +Java_akono_AkonoJni_stringFromJNI(JNIEnv* env, jobject thiz) +{ +#if defined(__arm__) + #if defined(__ARM_ARCH_7A__) + #if defined(__ARM_NEON__) + #if defined(__ARM_PCS_VFP) + #define ABI "armeabi-v7a/NEON (hard-float)" + #else + #define ABI "armeabi-v7a/NEON" + #endif + #else + #if defined(__ARM_PCS_VFP) + #define ABI "armeabi-v7a (hard-float)" + #else + #define ABI "armeabi-v7a" + #endif + #endif + #else + #define ABI "armeabi" + #endif +#elif defined(__i386__) +#define ABI "x86" +#elif defined(__x86_64__) +#define ABI "x86_64" +#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */ +#define ABI "mips64" +#elif defined(__mips__) +#define ABI "mips" +#elif defined(__aarch64__) +#define ABI "arm64-v8a" +#else +#define ABI "unknown" +#endif + + return env->NewStringUTF("Hello from JNI ! Compiled with ABI " ABI "."); +} + + +extern "C" JNIEXPORT jstring JNICALL +Java_akono_AkonoJni_evalJs(JNIEnv* env, jobject thiz, jstring source) +{ + std::unique_ptr platform = v8::platform::NewDefaultPlatform(); + v8::V8::InitializePlatform(platform.get()); + v8::V8::Initialize(); + return env->NewStringUTF("Hello World"); +} diff --git a/library/src/main/kotlin/akono/AkoniJni.kt b/library/src/main/kotlin/akono/AkoniJni.kt index d3bc7a72..e37bef0e 100644 --- a/library/src/main/kotlin/akono/AkoniJni.kt +++ b/library/src/main/kotlin/akono/AkoniJni.kt @@ -1,11 +1,13 @@ package akono; class AkonoJni { - external fun stringFromJNI(): String; + external fun stringFromJNI(): String; - companion object { - init { - System.loadLibrary("akono-jni") + external fun evalJs(source: String): String; + + companion object { + init { + System.loadLibrary("akono-jni") + } } - } } -- cgit v1.2.3