虽然网上有很多这方面的资料,但是在自己的环境下设置时总是存在这样那样的问题,所以我把自己实践的经验记录下来,也期望这些经验能帮助到有相同需求的同行。
主要内容来自:http://hohonuuli.blogspot.jp/2013/08/a-simple-java-native-interface-jni.html
1)创建Scala方法
class Sample1 { // --- Native methods @native def intMethod(n: Int): Int @native def booleanMethod(b: Boolean): Boolean @native def stringMethod(s: String): String @native def intArrayMethod(a: Array[Int]): Int } // --- Code in App body will get wrapped in a main method on compilation object Sample1 extends App { // --- Main method to test our native library System.loadLibrary("Sample1") val sample = new Sample1 val square = sample.intMethod(5) val bool = sample.booleanMethod(true) val text = sample.stringMethod("java") val sum = sample.intArrayMethod(Array(1, 1, 2, 3, 5, 8, 13)) println(s"intMethod: $square") println(s"booleanMethod: $bool") println(s"stringMethod: $text") println(s"intArrayMethod: $sum") }
scalac Sample1.scala
2. Sample1.h
SCALA_LIB_HOME=/usr/lib/scala/2.11.6/libexec/lib/
SCALA_CP=$SCALA_LIB_HOME/scala-library.jar:$SCALA_LIB_HOME/scala-reflect.jar
javah -cp $SCALA_CP:. Sample1
3. Sample.cpp C程序
#include "Sample1.h" #include <ctype.h> #include <string.h> // Mutate array to uppercase void uppercase(char* str) { size_t n = strlen(str); for (size_t i = 0; i < n; i++) { str[i] = toupper(str[i]); } } JNIEXPORT jint JNICALL Java_Sample1_intMethod (JNIEnv* env, jobject obj, jint num) { return num * num; } JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod (JNIEnv* env, jobject obj, jboolean boolean) { return !boolean; } JNIEXPORT jstring JNICALL Java_Sample1_stringMethod (JNIEnv* env, jobject obj, jstring string) { const char* str = env->GetStringUTFChars(string, 0); char cap[128]; strcpy(cap, str); env->ReleaseStringUTFChars(string, str); uppercase(cap); return env->NewStringUTF(cap); } JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod (JNIEnv* env, jobject obj, jintArray array) { int sum = 0; jsize len = env->GetArrayLength(array); jint* body = env->GetIntArrayElements(array, 0); for (int i = 0; i < len; i++) { sum += body[i]; } env->ReleaseIntArrayElements(array, body, 0); return sum; }
g++ -Wall -O3 -I/usr/includce -I$JAVA_HOME/include -I$JAVA_HOME/include/linux Sample1.cpp -fPIC -shared -o libSample1.so
4 run
scala -Djava.library.path=$(pwd) Sample1