From fbce71f91449b52d7caf055d2edc66d81138bb71 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Fri, 13 May 2016 11:31:56 -0700 Subject: Add scala classpath to javah --- .../scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala | 9 ++++++++- .../core/src/main/scala/multiclasses/Adder.scala | 6 +++++- .../core/src/main/scala/multiclasses/Main.scala | 4 +++- .../sbt-jni/multiclasses/native1/src/library.c | 19 +++++++++++++++++++ 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; +} -- cgit v1.2.3