Java调用C++
2014-01-08 09:54
246 查看
Java调用C/C++大概有这样几个步骤:
编写带有native方法的Java类, 使用javac工具编译Java类
使用javah来生成与native方法对应的头文件
实现相应的头文件, 并编译为动态链接库(windows下是.dll, linux下是.so)
编写带有native方法的Java类
编译Sample.java, 生成Sample.class文件
javac Sample.java
使用javah生成头文件, 生成Sample.h文件
javah Sample
通过Sample.cpp文件实现Sample.h文件中定义的native方法
编译Sample.cpp, 其中java头文件的目录根据编译机器进行修改, 生成Sample.o
g++ -I /usr/java/jdk1.7.0_21/include/ -I /usr/java/jdk1.7.0_21/include/linux/ -fPIC -c Sample.cpp
生成动态库文件,如果使用到其它对象文件(.o文件)以及动态连接库,则在Sample.o后面增加相应的参数
g++ -shared -Wl,-soname,libSample.so.1 -o libSample.so.1.0 Sample.o
设置动态库路径或拷贝到系统目录(/usr/lib或/usr/lib64)
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
测试
参考文献:
使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库, 在Java中调用C/C++本地库
编写带有native方法的Java类, 使用javac工具编译Java类
使用javah来生成与native方法对应的头文件
实现相应的头文件, 并编译为动态链接库(windows下是.dll, linux下是.so)
编写带有native方法的Java类
public class Sample { public native int intMethod(int n); public native boolean booleanMethod(boolean bool); public native String stringMethod(String text); public native int intArrayMethod(int[] intArray); }
编译Sample.java, 生成Sample.class文件
javac Sample.java
使用javah生成头文件, 生成Sample.h文件
javah Sample
通过Sample.cpp文件实现Sample.h文件中定义的native方法
#include "Sample.h" #include <string> JNIEXPORT jint JNICALL Java_Sample_intMethod (JNIEnv *env, jobject obj, jint num) { return num * num; } JNIEXPORT jboolean JNICALL Java_Sample_booleanMethod (JNIEnv *env, jobject obj, jboolean boolean) { return !boolean; } JNIEXPORT jstring JNICALL Java_Sample_stringMethod (JNIEnv *env, jobject obj, jstring string) { const char* str = env->GetStringUTFChars(string, 0); char cap[128]; strcpy(cap, str); env->ReleaseStringUTFChars(string, 0); return env->NewStringUTF(strupr(cap)); } JNIEXPORT jint JNICALL Java_Sample_intArrayMethod (JNIEnv *env, jobject obj, jintArray array) { int i, sum = 0; jsize len = env->GetArrayLength(array); jint *body = env->GetIntArrayElements(array, 0); for (i = 0; i < len; ++i) { sum += body[i]; } env->ReleaseIntArrayElements(array, body, 0); return sum; }
编译Sample.cpp, 其中java头文件的目录根据编译机器进行修改, 生成Sample.o
g++ -I /usr/java/jdk1.7.0_21/include/ -I /usr/java/jdk1.7.0_21/include/linux/ -fPIC -c Sample.cpp
生成动态库文件,如果使用到其它对象文件(.o文件)以及动态连接库,则在Sample.o后面增加相应的参数
g++ -shared -Wl,-soname,libSample.so.1 -o libSample.so.1.0 Sample.o
设置动态库路径或拷贝到系统目录(/usr/lib或/usr/lib64)
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
测试
public class TestSample { public static void main(String[] args) { System.loadLibrary("Sample"); Sample sample = new Sample(); int square = sample.intMethod(5); boolean bool = sample.booleanMethod(true); String text = sample.stringMethod("Java"); int sum = sample.intArrayMethod(new int[]{1,2,3,4,5,8,13}); System.out.println("intMethod: " + square); System.out.println("booleanMethod: " + bool); System.out.println("stringMethod: " + text); System.out.println("intArrayMethod: " + sum); } }
参考文献:
使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库, 在Java中调用C/C++本地库
相关文章推荐
- 在Mac OS X 用C++编写OpenGL程序
- C语言文件操作
- c++ 多态
- C语言是实现函数的重载
- vc++6在XP系统下运行X264
- base64
- C# 与 C++ 数据类型对照
- 使用C/C++设计Lu脚本函数时调用Lu脚本函数
- 【生物信息学】使用mRNA作为ref时,由bam格式计算rpkm 的 cpp程序
- C语言不起眼的运算符的优先级
- C++中构造函数前面的explicit关键字
- c++11 中的 move 与 forward
- [转载]FFmpeg - C++中使用ffmpeg库
- 【c++】常识易混提示
- mfc vs2010 C++ 连接mysql等数据库
- C指针原理(43)-C++-boost(日期时间)
- 【c++】动态绑定
- 有限状态机的实现方式
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- emacs之切换h/cpp配置