JNI的使用
来源:互联网 发布:网络诈骗案多久能破案 编辑:程序博客网 时间:2024/04/30 07:10
这次有个java项目,要求使用一个第三方提供的服务,但是第三方只提供dll(windows)或者so(Linux),需要使用C++调用
google搜索之后,发现可以使用JAVA的JNI来实现这一个功能,以下是mac上的,linux的基本一致,windows的请使用Visual Studio
首先写一个class,这里是Main
public class Main { static { System.load("/Users/tzry/Documents/examplecode/jnitest/src/libgoodluck.so"); } public native static void sayhello(); public static void main(String[] args) { Main test = new Main(); test.sayhello(); }}然后在命令行中
javac Main.java
得到Main.class
然后javah Main
得到Main.h
这个Main.h就是jni时c++需要的.h
编写Main.cpp
#include "Main.h"#include <iostream>using namespace std;JNIEXPORT void JNICALL Java_Main_sayhello (JNIEnv *env, jclass){ cout<<"hello world"<<endl; }
g++ -fPIC -D_REENTRANT -I/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/include/darwin -c Main.cpp
编译得到Main.o再
g++ -shared Main.o -o libgoodluck.so
得到.so文件
放在Main.java中的路径下后,运行,发现成功输出了hello world
c++回调Java
修改Main.java
public class Main { static { System.load("/Users/tzry/Documents/examplecode/jnitest/src/libgoodluck.so"); } public native static void sayhello(); public static void main(String[] args) { Main test = new Main(); test.sayhello(); } public void write(String str){ System.out.println(str); }}
重新javac,javah得到Main.class,Main.h,
修改Main.cpp
#include "Main.h"#include <iostream>using namespace std;JNIEXPORT void JNICALL Java_Main_sayhello (JNIEnv *env, jclass){ jstring str = NULL; jclass clz = env->FindClass("Main"); //获取clz的构造函数并生成一个对象 jmethodID ctor = env->GetMethodID(clz, "<init>", "()V"); jobject obj = env->NewObject(clz, ctor); // 如果是数组类型,则在类型前加[,如整形数组int[] intArray,则对应类型为[I,整形数组String[] strArray对应为[Ljava/lang/String; jmethodID mid = env->GetMethodID(clz, "write", "(Ljava/lang/String;)V"); if (mid) { jstring str1 = env->NewStringUTF("你好,世界!"); env->CallIntMethod(obj, mid, str1); } }
g++ -fPIC -D_REENTRANT -I/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/include/darwin -c Main.cpp
编译得到Main.o再
g++ -shared Main.o -o libgoodluck.so
得到.so文件
放在Main.java中的路径下后,运行,发现成功输出了你好,世界!
- JNI的使用(ZT)
- JNI 的使用
- JNI的使用
- 使用j2se的jni
- JNI 的使用
- JNI的简单使用
- JNI的使用
- JNi 的使用
- JNI的使用
- JNI的使用
- jni的学习使用
- jni的使用
- Android JNI的使用
- JNI的使用
- JNI的使用
- jni的使用
- jni的简单使用
- JNI的一些使用
- 如何优化正则项为2-1范数的问题
- leetcode(E)two sumII
- Java 操作Word Excel Outlook.
- 无法导入android.os.Handler
- js定时器
- JNI的使用
- JAVA面试 不使用API情况下,把数字字符串转换成int类型
- js中=,==和===的区别
- Java内存泄露原因详解
- MediaPlayer 视频播放
- 使用PyQt来编写第一个Python GUI程序
- spring切面的实现原理
- sql语句 创建数据库,表与删除数据库,表
- Js_函数的补充