日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JNI的一个简单实例

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JNI的一个简单实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本例子使用的操作系統MacOS, 64位JVM。

?

JNI編寫的幾個步驟如下:

?

編寫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靜態塊中用System.loadLibrary()加載本地庫。

?

使用javac命令編譯此java類:

?

javac com/xxx/clamaa/jni/HelloJni.java

??

?

利用javah命令生成C語言的頭文件(.h文件)

?

javah com.xxx.clamaa.jni.HelloJni

?

?

執行完成后,就在執行路徑下生成名稱為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

?

?

然后在同級的目錄下新建一個HelloJniImpl.cpp文件,這個與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++代碼的時候在MacOS下和在Linux Windows有所不同, 不是編譯成.so或者dll, 而是MacOS自己的jnilib. 并且jni.h的目錄也比較特殊, 是/System/Library/Frameworks/JavaVM.framework/Headers/,執行的命令g++,

g++ -dynamiclib -o libhellojniimpl.jnilib HelloJniImpl.cpp -framework JavaVM -I/System/Library/Frameworks/JavaVM.framework/Headers

?

編譯完成后,就生成libhellojniimpl.jnilib文件,此時執行結果為:

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)

?

如果設置成帶參數的本地方法,那么生成的參數會多一個jstring

Java_HelloWorld_print(JNIEnv *env, jobject obj, jstring str)

?

與原來的實現方式,調用方式都一樣,這樣簡單的JNI實現就完成了。?

?

?如果我們在原來的cpp實現中加入一行拋出異常的代碼:

cout << "Hello Jni by clamaa!"; throw 1; return;

?

那么在執行的過程中也會拋出對應的錯誤:

java com.yonyou.clamaa.jni.HelloJni >libc++abi.dylib: terminating with uncaught exception of type int >Hello Jni by clamaa!Abort trap: 6

?

?

轉載于:https://www.cnblogs.com/mmaa/p/5789917.html

總結

以上是生活随笔為你收集整理的JNI的一个简单实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。