<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java本地方法調用 ## 引子 ~~~ Class.forName("com.msql.jdbc.Driver"); ~~~ 我們在加載`mysql`的`jdbc`驅動時,會主動加載對應的驅動類,然后使用`DriverManager`來獲取連接操作數據庫。 跟進`forName`的實現會發現是調用的`native`方法來實現的,也就是`JNI(java native interface)`Java本地接口。 ~~~ /** Called after security check for system loader access checks have been made. */ private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader, Class<?> caller) throws ClassNotFoundException; ~~~ 其中有native關鍵字修飾的,則是Java定義的本地接口,使用C或者C++共享庫DLL(操作系統不同后綴不同)實現。 ![](https://img.kancloud.cn/ca/0d/ca0d1187fd0fae28dc3e7dd26dd4459e_348x230.png) 如下是Java和C的類型對應圖。 ![](https://img.kancloud.cn/af/04/af040d690013f2150f8e2cfab960be84_1590x692.png) ## 簡單案例入門 ### 步驟 1. 編寫Java類,定義本地方法 ~~~ public class NativeTest { /** * 加法 */ public static native int add(int a,int b); static { // 加載動態庫 System.loadLibrary("c_dll"); } public static void main(String[] args) { // 調用本地方法 int sum = add(2,3); System.out.println(sum); } } ~~~ 2. 編譯Java類,并生成c的頭文件 ``` javah -classpath /Users/mango/git/java-study/demo-case/target/classes -d ./cdll org.mango.demo._case.native2.NativeTest ``` 得到頭文件`org_mango_demo__case_native2_NativeTest.h` ~~~ /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class org_mango_demo__case_native2_NativeTest */ #ifndef _Included_org_mango_demo__case_native2_NativeTest #define _Included_org_mango_demo__case_native2_NativeTest #ifdef __cplusplus extern "C" { #endif /* * Class: org_mango_demo__case_native2_NativeTest * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_org_mango_demo__1case_native2_NativeTest_add (JNIEnv *, jclass, jint, jint); #ifdef __cplusplus } #endif #endif ~~~ 3. 編寫C語言實現本地方法 使用C的IDE工具CLion創建C語言的共享庫工廠c-dll。 ![](https://img.kancloud.cn/df/8d/df8dec0805d4d6b5b927aca0e9bf5b1e_1600x1244.png) 創建.c源文件,引入頭文件。 ![](https://img.kancloud.cn/fd/65/fd651110b7b9a2b30769974feb718481_2110x768.png) 其中需要將`jni.h`和`jni.md.h`也`copy`到同級目錄,這2個文件在jdk里,如下圖: ![](https://img.kancloud.cn/f2/23/f223d72b8f20f3474f72cd36ac8c2003_1556x1056.png) C語言實現add方法如下: ~~~ #include "org_mango_demo__case_native2_NativeTest.h" JNIEXPORT jint JNICALL Java_org_mango_demo__1case_native2_NativeTest_add (JNIEnv *env, jclass c, jint a, jint b){ printf("call native from c method\n"); printf("a=%d\nb=%d\n",a,b); return a+b; } ~~~ 4. 編譯C語言程序得到共享庫DLL文件 點擊菜單build工程得到共享庫文件 ![](https://img.kancloud.cn/14/6a/146a45a0308c3b947164a1eeae70d998_504x482.png) 在Mac上得到的是`libc_dll.dylib`的文件 ![](https://img.kancloud.cn/0f/24/0f24c08cf991de7797169dabfec46c0c_1610x478.png) 5. 鏈接加載DLL文件,在Java程序內調用本地方法 將動態庫文件copy到java工程的resources下(classpath) ![](https://img.kancloud.cn/4b/cf/4bcf067c2ebf87cdc9e42cf42a4db07e_654x480.png) 代碼里顯示加載: ~~~ static { System.loadLibrary("c_dll"); } ~~~ 運行Java程序后,報錯: ``` Exception in thread "main" java.lang.UnsatisfiedLinkError: no c_dll in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at org.mango.demo._case.native2.NativeTest.<clinit>(NativeTest.java:14) ``` 說明未配置動態庫,如下圖配置一下即可: ![](https://img.kancloud.cn/55/99/55992ce60d6931269ffb123ed118e020_2416x1230.png) 再次運行成功: ![](https://img.kancloud.cn/1a/d3/1ad3b5f88271a9157fcb3ec3dd5bdd87_2304x1336.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看