一、准备包含本地方法的.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