JNI的一个简单实例
本例子使用的操作系統(tǒng)MacOS, 64位JVM。
?
JNI編寫的幾個(gè)步驟如下:
?
編寫Java代碼,并注明native方法:
?
public class HelloJni {public native void displayHelloJni();public static void main(String[] args) {HelloJni helloJni = new HelloJni();helloJni.displayHelloJni();}static {System.loadLibrary("HelloJniImpl");} }?
其中聲明displayHelloJni()方法為本地方法,在static靜態(tài)塊中用System.loadLibrary()加載本地庫。
?
使用javac命令編譯此java類:
?
javac com/xxx/clamaa/jni/HelloJni.java??
?
利用javah命令生成C語言的頭文件(.h文件)
?
javah com.xxx.clamaa.jni.HelloJni?
?
執(zhí)行完成后,就在執(zhí)行路徑下生成名稱為com_xxx_clamaa_jni_HelloJni.h的頭文件:
?
#include <jni.h> /* Header for class com_xxx_clamaa_jni_HelloJni */#ifndef _Included_com_xxx_clamaa_jni_HelloJni #define _Included_com_xxx_clamaa_jni_HelloJni #ifdef __cplusplus extern "C" { #endif /** Class: com_yonyou_clamaa_jni_HelloJni* Method: displayHelloJni* Signature: ()V*/ JNIEXPORT void JNICALL Java_com_xxx_clamaa_jni_HelloJni_displayHelloJni(JNIEnv *, jobject);#ifdef __cplusplus } #endif #endif?
?
然后在同級(jí)的目錄下新建一個(gè)HelloJniImpl.cpp文件,這個(gè)與HelloJni.java中定義的System.loadLibrary()的文件名一致。
?
?
#include "com_xxx_clamaa_jni_HelloJni.h" #include <iostream> #include <jni.h> using namespace std; /** Class: HelloWorld* Method: displayHelloWorld* Signature: ()V*/ JNIEXPORT void JNICALL Java_com_xxx_clamaa_jni_HelloJni_displayHelloJni(JNIEnv *, jobject){cout << "Hello Jni by clamaa!";return; }?
編譯C++代碼的時(shí)候在MacOS下和在Linux Windows有所不同, 不是編譯成.so或者dll, 而是MacOS自己的jnilib. 并且jni.h的目錄也比較特殊, 是/System/Library/Frameworks/JavaVM.framework/Headers/,執(zhí)行的命令g++,
g++ -dynamiclib -o libhellojniimpl.jnilib HelloJniImpl.cpp -framework JavaVM -I/System/Library/Frameworks/JavaVM.framework/Headers?
編譯完成后,就生成libhellojniimpl.jnilib文件,此時(shí)執(zhí)行結(jié)果為:
java com.xxx.clamaa.jni.HelloJni >Hello Jni by clamaa!?
生成的文件名稱必須為: libhellojniimpl.jnilib,否則拋出異常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloJniImpl in java.library.pathat java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)at java.lang.Runtime.loadLibrary0(Runtime.java:870)at java.lang.System.loadLibrary(System.java:1119)at com.yonyou.clamaa.jni.HelloJni.<clinit>(HelloJni.java:16)?
如果設(shè)置成帶參數(shù)的本地方法,那么生成的參數(shù)會(huì)多一個(gè)jstring
Java_HelloWorld_print(JNIEnv *env, jobject obj, jstring str)?
與原來的實(shí)現(xiàn)方式,調(diào)用方式都一樣,這樣簡單的JNI實(shí)現(xiàn)就完成了。?
?
?如果我們?cè)谠瓉淼腸pp實(shí)現(xiàn)中加入一行拋出異常的代碼:
cout << "Hello Jni by clamaa!"; throw 1; return;?
那么在執(zhí)行的過程中也會(huì)拋出對(duì)應(yīng)的錯(cuò)誤:
java com.yonyou.clamaa.jni.HelloJni >libc++abi.dylib: terminating with uncaught exception of type int >Hello Jni by clamaa!Abort trap: 6?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mmaa/p/5789917.html
總結(jié)
以上是生活随笔為你收集整理的JNI的一个简单实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用密码词典
- 下一篇: 智见丨衣宝廉院士:燃料电池车是氢能应用的