亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

java jni調用c函數實例分享(java調用c函數)

2019-11-26 15:49:39
字體:
來源:轉載
供稿:網友

從C/C++到Java,再從Java回到C/C++,今天終于有機會了解了連接Java、C/C++的橋梁――JNI。哈哈!分享一下!

一、簡介
JNI是Java native interface的簡寫,可以譯作Java原生接口。Java可以通過JNI調用C/C++的庫,這對于那些對性能要求比較高的Java程序或者Java無法處理的任務無疑是一個很好的方式。

二、目的:Java代碼中調用C/C++代碼
三、實現:假設我們的Java程序為J2C.java, C程序為J2C.c, Java與C之間的通信函數名為write2proc;
              那么write2proc的聲明位于J2C.java,實現位于J2C.c;
四、操作
1. 編寫并編譯Java程序

    javac J2C.java => J2C.class
2. 生成C/C++頭文件

    javah J2C => J2C.h (安裝JDK后,$JAVA_HOME應該已加入$PATH, 否則使用絕對路徑,例如/usr/bin/javah)

3. 編寫對應的C/C++程序:J2C.c

4. 生成C/C++目標文件
    gcc -I/usr/lib/jvm/java-6-openjdk-amd64/include -I/usr/lib/jvm/java-6-openjdk-amd64/include/linux -fPIC -c J2C.c => J2C.o
5. 生成C/C++共享庫

    gcc -shared -Wl,-soname,libj2c.so.1 -o libj2c.so.1.0 J2C.o => libj2c.so.1.0

6. 重命名cp libj2c.so.1.0 libj2c.so => libj2c.so

7. 將共享庫加入動態鏈接庫的路徑(此例為當前目錄)
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

8. 執行Java程序,實現跨語言通信
     java J2C

 

五、具體過程

1. 編寫并編譯J2C.java

復制代碼 代碼如下:

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;

public class J2C
{
     static
     {
          try{
               // 此處即為本地方法所在鏈接庫名
               System.loadLibrary("j2c");
          } catch(UnsatisfiedLinkError e)
          {
               System.err.println( "Cannot load J2C library:/n " +
               e.toString() );
          }
     }

     //聲明的本地方法
     public static native int write2proc(int pid);

     public static void main(String[] args){

          //獲取本進程(即主線程)的pid
          final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
          final String info = runtime.getName();
          final int index = info.indexOf("@");


          if (index != -1) {
               final int pid = Integer.parseInt(info.substring(0, index));
               System.out.println(info);
               System.out.println(pid);

               write2proc(pid);
          }


          try{
               Thread.sleep(8000);
          } catch(InterruptedException e){
               e.printStackTrace();
          }
     }
}

note:Java程序中System.loadLibrary參數名表示要載入的C/C++共享庫,第6步生成的共享庫名必須與該參數一致,即System.loadLibrary(Name) 對應共享庫名libName.so (共享庫名必須以lib開頭)

2. 生成C頭文件J2C.h:javah J2C

復制代碼 代碼如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class J2C */

#ifndef _Included_J2C
#define _Included_J2C
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: J2C
 * Method: write2proc
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_J2C_write2proc
     (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

note:1. 頭文件自動生成,不要修改它;

2. 函數JNIEXPORT jint JNICALL Java_J2C_write2proc(JNIEnv *, jclass, jint);

 按照注釋的說明是在J2C.java文件的類J2C的方法write2proc處定義,故C程序的實現函數必須與該處簽名一致;

3. 編寫C程序J2C.c

復制代碼 代碼如下:

#include <stdio.h>

#include "J2C.h"

JNIEXPORT int JNICALL Java_J2C_write2proc(JNIEnv * env, jobject arg, jint pid)
{

     printf("current pid is %d/n", pid);

     return 0;

}

4. 編譯C程序

因為C程序里#include "J2C.h"而J2C.h又#include <jni.h>, 而gcc里面默認環境并不知道jni.h是什么東西,故編譯時需要告訴編譯器jni.h的位置( jni.h在jdk 的$JAVA_HOME/include下面),所以才有了上面的編譯參數;

因為使用gcc編譯得到動態庫,在jni調用的時候,某些情況會有異常, 可嘗試改用g++。

總結

1. Java中方法的原型聲明與C/C++對應的實現文件定義必須一致(可以通過自動生成的C/C++頭文件來比較),尤其是類名和方法名;

2. Java中System.loadLibrary()載入的共享庫名必須與后面C/C++生成的共享庫名一致。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍偷拍视频| 国产91久久婷婷一区二区| 成人a视频在线观看| 中文字幕国产精品久久| 亚洲欧洲在线免费| 欧洲日本亚洲国产区| 国产精品日韩欧美| 亚洲国产97在线精品一区| www.久久久久久.com| 色香阁99久久精品久久久| 夜夜嗨av一区二区三区四区| 亚洲电影免费在线观看| 亚洲一区二区三区777| 国产成人精品久久二区二区91| 欧美国产日韩一区二区| 欧美肥婆姓交大片| 一区二区三区亚洲| 在线视频一区二区| 奇米四色中文综合久久| 久久久精品美女| 国产精品三级美女白浆呻吟| 在线日韩第一页| 中文字幕一区二区三区电影| 欧美中文字幕视频在线观看| 国产精品福利片| 国产成人欧美在线观看| 成人午夜激情免费视频| 欧美日韩在线免费观看| 久久天天躁狠狠躁夜夜爽蜜月| 国产成人精品999| 视频在线观看一区二区| 亚洲欧美日韩视频一区| 亚洲午夜精品久久久久久久久久久久| 日韩69视频在线观看| 欧美噜噜久久久xxx| 狠狠色噜噜狠狠狠狠97| 日韩不卡在线观看| 亚洲天堂第一页| 97视频在线免费观看| 亚洲天堂色网站| 亚洲网站在线观看| 欧美日韩中文在线观看| 一区二区三区无码高清视频| 欧美日韩人人澡狠狠躁视频| 日日噜噜噜夜夜爽亚洲精品| 亚洲免费视频观看| 亚洲欧美在线一区| 欧美最顶级的aⅴ艳星| 精品欧美激情精品一区| 在线看欧美日韩| 2018日韩中文字幕| 久久色免费在线视频| 亚洲精品wwwww| 性金发美女69hd大尺寸| 97在线精品国自产拍中文| 国产偷国产偷亚洲清高网站| 欧美日韩亚洲国产一区| 57pao国产精品一区| 日本欧美精品在线| 91亚洲一区精品| 91理论片午午论夜理片久久| 亚洲美女在线看| 国产99视频精品免视看7| 国产精品日韩欧美| 欧美日韩另类在线| 欧美日韩在线另类| 成人免费在线网址| 欧美激情成人在线视频| 国产人妖伪娘一区91| 亚洲欧美国产制服动漫| 亚州欧美日韩中文视频| 91精品综合久久久久久五月天| 亚洲二区在线播放视频| 91在线直播亚洲| 欧美精品在线免费观看| 九色精品美女在线| 国产精品热视频| 国产日韩在线免费| 欧美丰满少妇xxxx| 亚洲一区二区在线播放| 日韩av免费看网站| 久久精品国产亚洲精品2020| 国产精品美女网站| 久久九九国产精品怡红院| 日韩中文理论片| 欧美精品在线观看91| 一本久久综合亚洲鲁鲁| 欧美精品18videos性欧美| 亚洲香蕉在线观看| 亚洲电影免费观看高清完整版| 91国产视频在线播放| 国产精品视频内| 日韩av黄色在线观看| 夜夜狂射影院欧美极品| 91人成网站www| 亚洲人成电影网站色www| 国产视频精品va久久久久久| 2021久久精品国产99国产精品| 久久91亚洲精品中文字幕奶水| 国产精选久久久久久| 欧美国产日产韩国视频| 欧美在线中文字幕| 国产裸体写真av一区二区| 亚洲在线视频福利| 国产精品pans私拍| 久久久久久久香蕉网| 久久伊人精品一区二区三区| 91在线播放国产| 国产精品视频永久免费播放| 色婷婷久久一区二区| 69久久夜色精品国产69| 精品久久久久久久久久久久久久| 亚洲女人天堂色在线7777| 成人激情视频在线观看| 成人网在线免费看| 欧美精品做受xxx性少妇| 欧美激情视频网站| 亚洲国产成人精品女人久久久| 亚洲综合日韩中文字幕v在线| 欧美专区日韩视频| 国产精品美腿一区在线看| 日韩在线观看免费全集电视剧网站| 日韩网站免费观看| 欧美激情第三页| 欧美日韩国产黄| 国产精品1区2区在线观看| 亚洲欧洲偷拍精品| 亚洲欧洲国产精品| 亚洲永久在线观看| 91黑丝高跟在线| 成人免费淫片视频软件| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲综合视频1区| 色偷偷偷综合中文字幕;dd| 91av在线国产| 两个人的视频www国产精品| 欧美高清在线播放| 疯狂蹂躏欧美一区二区精品| 91社影院在线观看| 中文字幕亚洲无线码a| 琪琪第一精品导航| 亚洲aⅴ日韩av电影在线观看| 欧美在线视频观看免费网站| 91精品国产高清久久久久久| 成人激情电影一区二区| 亚洲一区久久久| 全亚洲最色的网站在线观看| 精品美女永久免费视频| 久久手机精品视频| 日韩精品免费在线播放| 久久av在线播放| 97欧美精品一区二区三区| 午夜精品久久久久久久男人的天堂| 亚洲黄色av女优在线观看| 国产精品丝袜久久久久久不卡| 国产女同一区二区| 91精品国产电影| 日韩欧美极品在线观看| 精品色蜜蜜精品视频在线观看| 一区二区中文字幕| 亚洲电影中文字幕| 欧美在线视频网| 亚洲午夜未删减在线观看| 午夜精品福利电影|