您的位置:首页 > 编程语言 > C语言/C++

Scala 通过 JNI 连接 C++程序

2015-11-20 09:52 281 查看
虽然网上有很多这方面的资料,但是在自己的环境下设置时总是存在这样那样的问题,所以我把自己实践的经验记录下来,也期望这些经验能帮助到有相同需求的同行。

主要内容来自: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: