aboutsummaryrefslogtreecommitdiff
path: root/plugin/src/sbt-test
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2016-05-02 05:19:07 -0700
committerJakob Odersky <jakob@odersky.com>2016-05-11 11:17:09 -0700
commit791cb363b77332e3abdf4039102dfcdb863ce6c3 (patch)
tree09ff5d807a1407abedade57b692204ceac3f3280 /plugin/src/sbt-test
parent49563ee13599b0cb1add27b24446677a13b1f563 (diff)
downloadsbt-jni-791cb363b77332e3abdf4039102dfcdb863ce6c3.tar.gz
sbt-jni-791cb363b77332e3abdf4039102dfcdb863ce6c3.tar.bz2
sbt-jni-791cb363b77332e3abdf4039102dfcdb863ce6c3.zip
Use macro annotation to load native library
This also removes the need for third projects to depend on a "loader library".
Diffstat (limited to 'plugin/src/sbt-test')
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/README.md1
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/build.sbt16
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Adder.scala18
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Main.scala30
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Multiplier.scala12
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/CMakeLists.txt61
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c28
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/CMakeLists.txt61
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/library.c16
l---------plugin/src/sbt-test/sbt-jni/multiclasses/project/ScriptedHelper.scala1
l---------plugin/src/sbt-test/sbt-jni/multiclasses/project/plugins.sbt1
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/test2
-rw-r--r--plugin/src/sbt-test/sbt-jni/oneproject/README.md1
-rw-r--r--plugin/src/sbt-test/sbt-jni/oneproject/build.sbt6
l---------plugin/src/sbt-test/sbt-jni/oneproject/project/ScriptedHelper.scala1
l---------plugin/src/sbt-test/sbt-jni/oneproject/project/plugins.sbt1
l---------plugin/src/sbt-test/sbt-jni/oneproject/src/main1
l---------plugin/src/sbt-test/sbt-jni/oneproject/src/native1
-rw-r--r--plugin/src/sbt-test/sbt-jni/oneproject/test4
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/README.md1
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/build.sbt12
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Library.scala10
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Main.scala10
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/native/src/library.c16
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/project/ScriptedHelper.scala14
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/project/plugins.sbt3
-rw-r--r--plugin/src/sbt-test/sbt-jni/simple/test4
27 files changed, 332 insertions, 0 deletions
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/README.md b/plugin/src/sbt-test/sbt-jni/multiclasses/README.md
new file mode 100644
index 0000000..b039e7a
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/README.md
@@ -0,0 +1 @@
+Tests multiple native projects and native loading for classes.
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/build.sbt b/plugin/src/sbt-test/sbt-jni/multiclasses/build.sbt
new file mode 100644
index 0000000..d12a711
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/build.sbt
@@ -0,0 +1,16 @@
+ivyLoggingLevel := UpdateLogging.Quiet
+
+lazy val root = (project in file(".")).
+ aggregate(core, native1, native2)
+
+lazy val core = (project in file("core")).
+ dependsOn(native1 % Runtime).
+ dependsOn(native2 % Runtime)
+
+lazy val native1 = (project in file("native1")).
+ settings(sourceDirectory in nativeCompile := sourceDirectory.value).
+ enablePlugins(JniNative)
+
+lazy val native2 = (project in file("native2")).
+ settings(sourceDirectory in nativeCompile := sourceDirectory.value).
+ enablePlugins(JniNative)
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Adder.scala b/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Adder.scala
new file mode 100644
index 0000000..91d5683
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Adder.scala
@@ -0,0 +1,18 @@
+package multiclasses
+
+import ch.jodersky.jni.nativeLoader
+
+@nativeLoader("demo0")
+class Adder(base0: Int) {
+
+ final private val base = base0
+
+ @native def plus(term: Int): Int
+
+}
+
+object Adder {
+
+ @native def sum(term1: Int, term2: Int): Int
+
+}
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Main.scala b/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Main.scala
new file mode 100644
index 0000000..6734ae9
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Main.scala
@@ -0,0 +1,30 @@
+package multiclasses
+
+object Main {
+
+ def addition(): Unit = {
+ val zero = new Adder(0)
+ val one = new Adder(1)
+ assert((zero plus 1) == 1)
+ assert((one plus 1) == 2)
+ assert(Adder.sum(0,1) == 1)
+ }
+
+ def multiplication(): Unit = {
+ val zero = new Multiplier {
+ override def base = 0
+ }
+
+ val one = new Multiplier {
+ override def base = 1
+ }
+ assert((zero times 1) == 0)
+ assert((one times 1) == 1)
+ }
+
+ def main(args: Array[String]): Unit = {
+ addition()
+ multiplication()
+ }
+
+}
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Multiplier.scala b/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Multiplier.scala
new file mode 100644
index 0000000..19cd25f
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Multiplier.scala
@@ -0,0 +1,12 @@
+package multiclasses
+
+import ch.jodersky.jni.nativeLoader
+
+@nativeLoader("multiplier1")
+abstract class Multiplier {
+
+ def base: Int = 1
+
+ @native def times(factor: Int): Int
+
+}
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/CMakeLists.txt b/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/CMakeLists.txt
new file mode 100644
index 0000000..1539ec2
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/CMakeLists.txt
@@ -0,0 +1,61 @@
+################################################################
+# A minimal CMake file that is compatible with sbt-jni #
+# #
+# All settings required by sbt-jni have been marked so, please #
+# add/modify/remove settings to build your specific library. #
+################################################################
+
+cmake_minimum_required(VERSION 2.6)
+
+# Define project and related variables
+#
+project (demo)
+
+# Set versions and library name
+# (required by sbt-jni) please use semantic versioning
+#
+set (VERSION_MAJOR 0)
+set (VERSION_MINOR 0)
+set (VERSION_PATCH 0)
+# (required by sbt-jni) major version will always be appended to library name
+set (LIB_NAME ${CMAKE_PROJECT_NAME}${VERSION_MAJOR})
+
+# Command-line options
+#
+# (set by sbt-jni)
+set (LIB_INSTALL_DIR lib CACHE PATH "Path in which to install libraries (equivalent to Autoconf --libdir).")
+# (set by sbt-jni)
+set (LIB_ENABLE_MINOR_VERSIONS ON CACHE BOOLEAN "Build libraries with minor and patch versions appended.")
+
+# Setup JNI
+find_package(JNI REQUIRED)
+if (JNI_FOUND)
+ message (STATUS "JNI include directories: ${JNI_INCLUDE_DIRS}")
+endif()
+
+# Include directories
+include_directories(.)
+include_directories(../../core/target/native/include)
+include_directories(${JNI_INCLUDE_DIRS})
+
+# Setup main shared library
+file(GLOB LIB_SRC
+ "*.c"
+ "*.cpp"
+)
+add_library(${LIB_NAME} SHARED ${LIB_SRC})
+
+# By default, in a regular build, minor and patch versions are added to the generated files.
+# When built through sbt-jni however, LIB_ENABLE_MINOR_VERSIONS is deactivated and only a
+# major-versioned library file is built.
+if (LIB_ENABLE_MINOR_VERSIONS)
+ set_target_properties(
+ ${LIB_NAME}
+ PROPERTIES
+ VERSION 0.${VERSION_MINOR}.${VERSION_PATCH} # major version always 0, it is included in library name
+ SOVERSION 0
+ )
+endif()
+
+# Installation targets
+install(TARGETS ${LIB_NAME} LIBRARY DESTINATION ${LIB_INSTALL_DIR})
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c b/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c
new file mode 100644
index 0000000..8b45660
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c
@@ -0,0 +1,28 @@
+#include <jni.h>
+#include "multiclasses_Adder.h"
+#include "multiclasses_Adder__.h"
+
+/*
+ * Class: multiclasses_Adder
+ * Method: plus
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_multiclasses_Adder_plus
+ (JNIEnv* env, jobject instance, jint term)
+{
+ jclass clazz = (*env)->GetObjectClass(env, instance);
+ jfieldID field = (*env)->GetFieldID(env, clazz, "base", "I");
+ jint base = (*env)->GetIntField(env, instance, field);
+ return base + term;
+}
+
+/*
+ * Class: multiclasses_Adder__
+ * Method: sum
+ * Signature: (II)I
+ */
+JNIEXPORT jint JNICALL Java_multiclasses_Adder_00024_sum
+ (JNIEnv* env, jobject instance, jint term1, jint term2)
+{
+ return term1 + term2;
+}
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/CMakeLists.txt b/plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/CMakeLists.txt
new file mode 100644
index 0000000..feeab89
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/CMakeLists.txt
@@ -0,0 +1,61 @@
+################################################################
+# A minimal CMake file that is compatible with sbt-jni #
+# #
+# All settings required by sbt-jni have been marked so, please #
+# add/modify/remove settings to build your specific library. #
+################################################################
+
+cmake_minimum_required(VERSION 2.6)
+
+# Define project and related variables
+#
+project (multiplier)
+
+# Set versions and library name
+# (required by sbt-jni) please use semantic versioning
+#
+set (VERSION_MAJOR 1)
+set (VERSION_MINOR 2)
+set (VERSION_PATCH 3)
+# (required by sbt-jni) major version will always be appended to library name
+set (LIB_NAME ${CMAKE_PROJECT_NAME}${VERSION_MAJOR})
+
+# Command-line options
+#
+# (set by sbt-jni)
+set (LIB_INSTALL_DIR lib CACHE PATH "Path in which to install libraries (equivalent to Autoconf --libdir).")
+# (set by sbt-jni)
+set (LIB_ENABLE_MINOR_VERSIONS ON CACHE BOOLEAN "Build libraries with minor and patch versions appended.")
+
+# Setup JNI
+find_package(JNI REQUIRED)
+if (JNI_FOUND)
+ message (STATUS "JNI include directories: ${JNI_INCLUDE_DIRS}")
+endif()
+
+# Include directories
+include_directories(.)
+include_directories(../../core/target/native/include)
+include_directories(${JNI_INCLUDE_DIRS})
+
+# Setup main shared library
+file(GLOB LIB_SRC
+ "*.c"
+ "*.cpp"
+)
+add_library(${LIB_NAME} SHARED ${LIB_SRC})
+
+# By default, in a regular build, minor and patch versions are added to the generated files.
+# When built through sbt-jni however, LIB_ENABLE_MINOR_VERSIONS is deactivated and only a
+# major-versioned library file is built.
+if (LIB_ENABLE_MINOR_VERSIONS)
+ set_target_properties(
+ ${LIB_NAME}
+ PROPERTIES
+ VERSION 0.${VERSION_MINOR}.${VERSION_PATCH} # major version always 0, it is included in library name
+ SOVERSION 0
+ )
+endif()
+
+# Installation targets
+install(TARGETS ${LIB_NAME} LIBRARY DESTINATION ${LIB_INSTALL_DIR})
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/library.c b/plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/library.c
new file mode 100644
index 0000000..5fe817e
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/native2/src/library.c
@@ -0,0 +1,16 @@
+#include <jni.h>
+#include "multiclasses_Multiplier.h"
+
+/*
+ * Class: multiclasses_Multiplier
+ * Method: times
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_multiclasses_Multiplier_times
+ (JNIEnv* env, jobject instance, jint factor)
+{
+ jclass clazz = (*env)->GetObjectClass(env, instance);
+ jmethodID method = (*env)->GetMethodID(env, clazz, "base", "()I");
+ jint base = (*env)->CallIntMethod(env, instance, method);
+ return base * factor;
+}
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/project/ScriptedHelper.scala b/plugin/src/sbt-test/sbt-jni/multiclasses/project/ScriptedHelper.scala
new file mode 120000
index 0000000..aeaba9d
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/project/ScriptedHelper.scala
@@ -0,0 +1 @@
+../../simple/project/ScriptedHelper.scala \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/project/plugins.sbt b/plugin/src/sbt-test/sbt-jni/multiclasses/project/plugins.sbt
new file mode 120000
index 0000000..1c60ea7
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/project/plugins.sbt
@@ -0,0 +1 @@
+../../simple/project/plugins.sbt \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/multiclasses/test b/plugin/src/sbt-test/sbt-jni/multiclasses/test
new file mode 100644
index 0000000..e9e0d97
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/test
@@ -0,0 +1,2 @@
+> javah
+> core/run \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/README.md b/plugin/src/sbt-test/sbt-jni/oneproject/README.md
new file mode 100644
index 0000000..9d78fef
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/README.md
@@ -0,0 +1 @@
+Tests the combination of native and scala sources in a single project.
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/build.sbt b/plugin/src/sbt-test/sbt-jni/oneproject/build.sbt
new file mode 100644
index 0000000..3b95d55
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/build.sbt
@@ -0,0 +1,6 @@
+ivyLoggingLevel := UpdateLogging.Quiet
+
+enablePlugins(JniNative)
+
+target in javah := (sourceDirectory in nativeCompile).value / "include"
+
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/project/ScriptedHelper.scala b/plugin/src/sbt-test/sbt-jni/oneproject/project/ScriptedHelper.scala
new file mode 120000
index 0000000..aeaba9d
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/project/ScriptedHelper.scala
@@ -0,0 +1 @@
+../../simple/project/ScriptedHelper.scala \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/project/plugins.sbt b/plugin/src/sbt-test/sbt-jni/oneproject/project/plugins.sbt
new file mode 120000
index 0000000..1c60ea7
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/project/plugins.sbt
@@ -0,0 +1 @@
+../../simple/project/plugins.sbt \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/src/main b/plugin/src/sbt-test/sbt-jni/oneproject/src/main
new file mode 120000
index 0000000..1b483d7
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/src/main
@@ -0,0 +1 @@
+../../simple/core/src/main/ \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/src/native b/plugin/src/sbt-test/sbt-jni/oneproject/src/native
new file mode 120000
index 0000000..ebbac72
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/src/native
@@ -0,0 +1 @@
+../../simple/native/src/ \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/oneproject/test b/plugin/src/sbt-test/sbt-jni/oneproject/test
new file mode 100644
index 0000000..2c485fa
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/oneproject/test
@@ -0,0 +1,4 @@
+> javah
+$ exists src/native/include/simple_Library__.h
+> nativeInit cmake demo
+> run \ No newline at end of file
diff --git a/plugin/src/sbt-test/sbt-jni/simple/README.md b/plugin/src/sbt-test/sbt-jni/simple/README.md
new file mode 100644
index 0000000..54179b2
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/README.md
@@ -0,0 +1 @@
+Very basic test.
diff --git a/plugin/src/sbt-test/sbt-jni/simple/build.sbt b/plugin/src/sbt-test/sbt-jni/simple/build.sbt
new file mode 100644
index 0000000..e324d5a
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/build.sbt
@@ -0,0 +1,12 @@
+ivyLoggingLevel := UpdateLogging.Quiet
+
+lazy val root = (project in file(".")).
+ aggregate(core, native)
+
+lazy val core = (project in file("core")).
+ settings(target in javah := (sourceDirectory in nativeCompile in native).value / "include").
+ dependsOn(native % Runtime)
+
+lazy val native = (project in file("native")).
+ settings(sourceDirectory in nativeCompile := sourceDirectory.value).
+ enablePlugins(JniNative)
diff --git a/plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Library.scala b/plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Library.scala
new file mode 100644
index 0000000..785f8dd
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Library.scala
@@ -0,0 +1,10 @@
+package simple
+
+import ch.jodersky.jni.nativeLoader
+
+@nativeLoader("demo0")
+object Library {
+
+ @native def say(message: String): Int
+
+}
diff --git a/plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Main.scala b/plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Main.scala
new file mode 100644
index 0000000..c54d6e0
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/core/src/main/scala/simple/Main.scala
@@ -0,0 +1,10 @@
+package simple
+
+object Main {
+
+ def main(args: Array[String]): Unit = {
+ val result = Library.say("hello world")
+ assert(result == 42)
+ }
+
+}
diff --git a/plugin/src/sbt-test/sbt-jni/simple/native/src/library.c b/plugin/src/sbt-test/sbt-jni/simple/native/src/library.c
new file mode 100644
index 0000000..4fa15b1
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/native/src/library.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include "simple_Library__.h"
+
+/*
+ * Class: simple_Library__
+ * Method: say
+ * Signature: (Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_simple_Library_00024_say
+(JNIEnv *env, jobject clazz, jstring message) {
+ const char* msg = (*env)->GetStringUTFChars(env, message, 0);
+ fprintf(stdout, "Printing from native library: %s\n", msg);
+ fflush(stdout);
+ (*env)->ReleaseStringUTFChars(env, message, msg);
+ return 42;
+}
diff --git a/plugin/src/sbt-test/sbt-jni/simple/project/ScriptedHelper.scala b/plugin/src/sbt-test/sbt-jni/simple/project/ScriptedHelper.scala
new file mode 100644
index 0000000..cd63c89
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/project/ScriptedHelper.scala
@@ -0,0 +1,14 @@
+import sbt._
+import sbt.Keys._
+
+object ScriptedHelper extends AutoPlugin {
+
+ override def requires = empty
+ override def trigger = allRequirements
+
+ override def projectSettings = Seq(
+ crossScalaVersions := Seq("2.11.8", "2.12.0-M4"),
+ scalaVersion := crossScalaVersions.value.head
+ )
+
+}
diff --git a/plugin/src/sbt-test/sbt-jni/simple/project/plugins.sbt b/plugin/src/sbt-test/sbt-jni/simple/project/plugins.sbt
new file mode 100644
index 0000000..b8fc7ed
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/project/plugins.sbt
@@ -0,0 +1,3 @@
+ivyLoggingLevel := UpdateLogging.Quiet
+
+addSbtPlugin("ch.jodersky" % "sbt-jni" % System.getProperty("plugin.version"))
diff --git a/plugin/src/sbt-test/sbt-jni/simple/test b/plugin/src/sbt-test/sbt-jni/simple/test
new file mode 100644
index 0000000..dd9e5bf
--- /dev/null
+++ b/plugin/src/sbt-test/sbt-jni/simple/test
@@ -0,0 +1,4 @@
+> javah
+$ exists native/src/include/simple_Library__.h
+> nativeInit cmake demo
+> core/run \ No newline at end of file