JNI用法小例子

一、准备包含本地方法的.java文件(ContentVideo.java),包括set()和get()两个方法。

public class ContentVideo {

    public native static String get(); //对将要调用的方法做本地声明
    public native static void set(int i);static
    {
        System.loadLibrary("InputFormatSo"); //在类中声明所调用的库名称
    }

}

二、生成对应的.h文件

javah -jni ContentVideo

三、根据ContentVideo.h文件,编写自己的ContentVideo.cpp文件,ContentVideo.cpp内容如下:

#include "ContentVideo.h"
#include <string>
#include<string.h>
using namespace std;
int i = 0;
//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
       jclass strClass = env->FindClass("Ljava/lang/String;");
       jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
       jbyteArray bytes = env->NewByteArray(strlen(pat));
       env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
       jstring encoding = env->NewStringUTF("utf-8");
       return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}

JNIEXPORT jstring JNICALL Java_ContentVideo_get
  (JNIEnv* env, jclass) {
    if(i >= 0 && i < 60) {
        return stoJstring(env, "bad");
    }
    else if(i >= 61 && i < 90) {
        return stoJstring(env, "ok");
    }
    else if(i >= 90 && i <= 100) {
        return stoJstring(env, "good");
    }
    else {
        return stoJstring(env, "input data is wrong");
    }
}


JNIEXPORT void JNICALL Java_ContentVideo_set
  (JNIEnv *, jclass, jint m) {

    i = m;
}

四、编译.cpp文件,生成对应的.so文件,即libInputFormatSo.so

     Makefile文件内容如下:

g++ -o libInputFormatSo.so ContentVideo.cpp -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -fPIC -shared
sudo cp libInputFormatSo.so /usr/lib  #把libInputFormatSo.so加到java.library.path路径下

五、编写Java主程序文件(ContentMain.java),该程序会调用含有本地方法的Java类ContentVideo,主程序如下:

public class ContentMain {

        public static void main(String[] args) {
           ContentVideo.set(Integer.parseInt(args[0]));
           System.out.println(ContentVideo.get());
        }
}

六、编译ContentMain.java并运行类ContentMain

javac ContentMain.java
java ContentMain 12

最终程序输出结果:bad

原文地址:https://www.cnblogs.com/lasclocker/p/4648376.html