aboutsummaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2016-05-13 11:31:56 -0700
committerJakob Odersky <jakob@odersky.com>2016-05-13 11:37:09 -0700
commitfbce71f91449b52d7caf055d2edc66d81138bb71 (patch)
tree4cd420dcb7e51d182a9a513635b7f41c6aeb91e4 /plugin
parent4ace77ae308e7dd2ac17878fbf903769bc8811bf (diff)
downloadsbt-jni-fbce71f91449b52d7caf055d2edc66d81138bb71.tar.gz
sbt-jni-fbce71f91449b52d7caf055d2edc66d81138bb71.tar.bz2
sbt-jni-fbce71f91449b52d7caf055d2edc66d81138bb71.zip
Add scala classpath to javah
Diffstat (limited to 'plugin')
-rw-r--r--plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala9
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Adder.scala6
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/core/src/main/scala/multiclasses/Main.scala4
-rw-r--r--plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c19
4 files changed, 35 insertions, 3 deletions
diff --git a/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala b/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala
index edda1fc..eee5875 100644
--- a/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala
+++ b/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala
@@ -39,7 +39,14 @@ object JniJavah extends AutoPlugin {
javah := {
val out = (target in javah).value
- val jcp: Seq[File] = { (compile in Compile).value; Seq((classDirectory in Compile).value) }
+
+ // fullClasspath can't be used here since it also generates resources. In
+ // a project combining JniJavah and JniPackage, we would have a chicken-and-egg
+ // problem.
+ val jcp: Seq[File] = (dependencyClasspath in Compile).value.map(_.data) ++ {
+ (compile in Compile).value; Seq((classDirectory in Compile).value)
+ }
+
val cp = jcp.mkString(sys.props("path.separator"))
val log = streams.value.log
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
index 91d5683..69ac203 100644
--- 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
@@ -2,13 +2,17 @@ package multiclasses
import ch.jodersky.jni.nativeLoader
+case class Value(x: Int)
+
@nativeLoader("demo0")
class Adder(base0: Int) {
final private val base = base0
-
+
@native def plus(term: Int): Int
+ @native def plusValue(value: Value): Int
+
}
object Adder {
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
index 6734ae9..e8ea14e 100644
--- 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
@@ -7,7 +7,9 @@ object Main {
val one = new Adder(1)
assert((zero plus 1) == 1)
assert((one plus 1) == 2)
- assert(Adder.sum(0,1) == 1)
+ assert(Adder.sum(0, 1) == 1)
+
+ assert((one plusValue Value(1)) == 2)
}
def multiplication(): Unit = {
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
index 8b45660..719d135 100644
--- a/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c
+++ b/plugin/src/sbt-test/sbt-jni/multiclasses/native1/src/library.c
@@ -26,3 +26,22 @@ JNIEXPORT jint JNICALL Java_multiclasses_Adder_00024_sum
{
return term1 + term2;
}
+
+/* Class: multiclasses_Adder
+ * Method: plusValue
+ * Signature: (Lmulticlasses/Value;)I
+ */
+JNIEXPORT jint JNICALL Java_multiclasses_Adder_plusValue
+ (JNIEnv* env, jobject instance, jobject value)
+{
+ jclass adderClass = (*env)->GetObjectClass(env, instance);
+ jfieldID baseField = (*env)->GetFieldID(env, adderClass, "base", "I");
+ jint base = (*env)->GetIntField(env, instance, baseField);
+
+ // Value.x
+ jclass valueClass = (*env)->GetObjectClass(env, value);
+ jmethodID xGetter = (*env)->GetMethodID(env, valueClass, "x", "()I");
+ jint x = (*env)->CallIntMethod(env, value, xGetter);
+
+ return base + x;
+}