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中的路径下后,运行,发现成功输出了你好,世界!


0 0
原创粉丝点击