Scala 通过 JNI 连接 C++程序
2015-11-20 09:52
281 查看
虽然网上有很多这方面的资料,但是在自己的环境下设置时总是存在这样那样的问题,所以我把自己实践的经验记录下来,也期望这些经验能帮助到有相同需求的同行。
主要内容来自:http://hohonuuli.blogspot.jp/2013/08/a-simple-java-native-interface-jni.html
1)创建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程序
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
主要内容来自: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
相关文章推荐
- 今日学习札记——STL通用算法(11.20)
- 设计模式C++ (Composite组合模式)
- 虚函数不应该是inlined(More Effective C++ 笔记)
- 22.c/c++程序员面试宝典-类
- Google C++ style
- 5个月iOS开发入门总结(C++转行iOS)
- 第10周项目1 二叉树算法库
- C/C++中产生随机数(rand,srand用法)
- C++实现单链表(2) 一些函数的实现
- C++之容器
- C++之容器(关联容器)
- c++中的关联容器
- C++之UML图示
- AVL树C++实现
- 【C语言】第一章 导言
- 【C语言】编写一个函数reverse_string(char * string)(递归实现
- 【C语言】【面试题】【笔试题】写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
- strstr查找子字符串函数
- 【C语言】【面试题】【笔试题】编写一个函数实现n^k,使用递归实现
- 【C语言】在终端输入多行信息,找出包含“ould”的行,并打印改行