1. 程式人生 > >JoeySheng的專欄-移動網際網路技術發展部落格

JoeySheng的專欄-移動網際網路技術發展部落格

寫在最前面

Java中呼叫C庫函式,依賴JNI,本文使用一個非常簡單的例子來說明JNI開發流程,具體步驟如下:

第一步:編寫Java程式碼

第二步:編譯Java程式碼

第三步:生成C語言標頭檔案

第四步:編寫C程式碼

第五步:生成C共享庫

第六步:執行Java程式

注:本文中將僅在Java程式碼中宣告的方法稱為本地方法,使用C/C++實現的函式稱為本地函式。

第一步:編寫Java程式碼

若想在Java程式碼中通過JNI呼叫C函式,首先在Java類中宣告本地方法,本地方法僅在Java程式中進行宣告,使用C/C++等本地語言來實現。

如下程式碼HelloJNI.java

1 class HelloJNI
  2 {
  3     // 本地方法宣告
  4     native void printHello();
  5     native void printString(String str);
  6 
  7     // 載入庫
  8     static{ System.loadLibrary("hello"); }
  9 
 10     public static void main(String args[])
 11     {
 12         HelloJNI myJNI = new HelloJNI();
 13 
 14         // 呼叫本地方法(實際呼叫的事使用C語言編寫的JNI本地函式)
 15         myJNI.printHello();
 16         myJNI.printString("Hello World from printString fun");
 17     }
 18 }

在Java中,使用“native”關鍵字,宣告本地方法,該方法與用C/C++編寫的JNI本地函式相對應。

如下,不同平臺下System.loadLibrary()方法載入的C執行庫

作業系統平臺 System.loadLibrary()方法的引數 實際載入的C執行庫
Windows hello HelloJNI.dll
Linux hello HelloJNI.so
Mac hello libHelloJNI.jnilib

第二步:編譯Java程式碼

使用Java編譯器(javac),編譯Java原始碼,命令如下

javac HelloJNI.java
編譯好HelloJNI.java後,生成HelloJNI.class

第三步:生成C語言標頭檔案

使用javah命令生成C語言標頭檔案,命令如下

javah HelloJNI
執行之後,生成HelloJNI.h標頭檔案,檔案內容如下
 1 /* DO NOT EDIT THIS FILE - it is machine generated */
  2 #include <jni.h>
  3 /* Header for class HelloJNI */
  4 
  5 #ifndef _Included_HelloJNI
  6 #define _Included_HelloJNI
  7 #ifdef __cplusplus
  8 extern "C" {
  9 #endif
 10 /*
 11  * Class:     HelloJNI
 12  * Method:    printHello
 13  * Signature: ()V
 14  */
 15 JNIEXPORT void JNICALL Java_HelloJNI_printHello
 16   (JNIEnv *, jobject);
 17 
 18 /*
 19  * Class:     HelloJNI
 20  * Method:    printString
 21  * Signature: (Ljava/lang/String;)V
 22  */
 23 JNIEXPORT void JNICALL Java_HelloJNI_printString
 24   (JNIEnv *, jobject, jstring);
 25 
 26 #ifdef __cplusplus
 27 }
 28 #endif
 29 #endif

第四步:編寫C程式碼

在C函式原型檔案生成後,開始編寫C程式碼,HelloJNI.c,如下

1 #include "HelloJNI.h"
  2 #include <stdio.h>
  3 
  4 JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject object)
  5 {
  6     printf("Hello World!\n");
  7     return;
  8 }
  9 
 10 JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject object, jstring string)
 11 {
 12     // 將 Java String轉換為C字串
 13     const char *str = (*env)->GetStringUTFChars(env,string,0);
 14     printf("%s!\n", str);
 15 
 16     return;
 17 }

第五步:生成C共享庫

mac環境下使用如下命令生成動態連結庫

gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include/ HelloJNI.c -o libHelloJNI.jnilib

後面的libHelloJNI.jnilib就是我們需要的動態連結庫,但是執行這個命令的時候報瞭如下錯誤
In file included from HelloWorldImpl.c:1:
/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include/jni.h:45:10: fatal error:
      'jni_md.h' file not found
#include "jni_md.h"
         ^
1 error generated.
提示jni_md.h這個檔案找不到;我們執行下面的命令拷貝一份
sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/include

然後再執行生成動態庫的命令即可。

第六步:執行Java程式

最後執行java程式,如下命令

java HelloJNI
即可得到如下輸出結果
Hello World!
Hello World from printString fun!

總結

通過以上步驟,我們知道了Java本地方法如何通過JNI連結到C函式,以及具體實現等

最後,做個小結,梳理一下

(1)在Java類中宣告本地方法

(2)使用javah命令,生成包含JNI本地函式原型的標頭檔案

(3)實現JNI本地函式

(4)生成C共享庫

(5)通過JNI,呼叫JNI的本地函式

相關推薦

JoeySheng專欄-移動網際網路技術發展部落

寫在最前面 Java中呼叫C庫函式,依賴JNI,本文使用一個非常簡單的例子來說明JNI開發流程,具體步驟如下: 第一步:編寫Java程式碼 第二步:編譯Java程式碼 第三步:生成C語言標頭檔案 第四步:編寫C程式碼 第五步:生成C共享庫 第六步:執行Java程式 注:本文

關注IT運維技術網際網路的個人部落

本系列文章一共三篇,分別為《指令碼程式設計與Linux命令》、《接入層與網路基礎》和《 MySQL 與 SQL 優化》,由騰訊高階工程師 luaruan(阮永順) 原創、張戈部落格整理分享,如有勘誤請在部落格留... 10月26日  閱讀 679   9

【視訊免費分享】基於Spring Boot技術部落系統企業級前後端實戰

推薦視訊連結 Java 微服務實踐視訊教程 - Spring Boot Java 微服務實踐 視訊教程- Spring Cloud redis高可用視訊 分散式電商商城視訊教程 kubernets+docer jvm 秒殺專案實戰 Lin

基於Springboot技術部落系統實踐及應用之四(Elasticsearch)

本部落格從全文搜尋、ES簡介、ES核心概念、ES與SpringBoot整合以及ES實戰共五個方面進行詳細介紹和應用。 1、全文搜尋介紹 全文搜尋搜尋的物件主要有兩種: 1、結構化資料:具有固定格式或固定長度的資料,例如,資料庫,元資料 2、非結構化資料:無固定格式或者無固定長度的

基於Springboot技術部落系統實踐及應用之三(Spring Data JPA)

本部落格將從JPA簡介、Spring Data JPA用法介紹、Spring Data JPA、Hibernate與SpringBoot整合以及資料持久化實戰四個方面進行詳細描述Spring Data JPA的用法和應用。 1、JA

基於Springboot技術部落系統實踐及應用之一

部落格系統功能如下: 涉及到的技術: 通過技術實現,完成程式碼開發,最後系統效果如下圖: 部落格實戰 部落格實戰分三步走: 第一點:主要講解的核心技術: 1、Gradle、Gradle Wrapper 2、開發環境搭建及專案執行 3、 Th

基於Springboot技術部落系統實踐及應用之二(thymleaf)

一、概念             Thymleaf是一個jave模板引擎,與SpringBoot整合 非常方便,類似於Freemarker,但是比Freemarker效能要好一些;Thymleaf支援自然語言,即:原型就是

基於Spring Boot技術部落系統企業級前後端實戰 漸進式講解+Thymeleaf+Elasticsearch+多種資料庫

第1章 Spring Boot 簡介講解Spring Boot的專案背景,已經與其他技術框架(比如,Spring、SpringMVC、SpringCloud等)的關係。簡單介紹下Spring Boot 整個生態系統1-1 _Spring Boot部落格_課程導學1-2 -Spring Boot 是什麼 第2

慕課網實戰課程之基於Spring Boot技術部落系統企業級前後端實戰

慕課網實戰課程專案-基於Spring boot部落格的搭建教程 技術棧 後端: SpringBoot+ElasticSearch+SpringSecurity 前端: Thymeleaf/Bootstrap/jQuery 資料庫:MySQL/MongoD

2017年,移動開發者有哪些部落可以關注

2017年伊始,打算先寫寫水文,梳理下去年看了哪些部落格,關注了哪些平臺。由於我去年一直在運營簡書專題-移動前沿、伯樂線上 iOS 專欄,以及微信公眾號 iOS 大全,所以還是關注了很多作者以及公眾號,今天就先寫寫自己關注的那些部落格和公眾號吧。個人iOS方面經驗多一些,

葡萄城技術團隊部落(為開發者提供專業的開發工具、解決方案和服務,賦能開發者)

ASP.NET MVC入門教程系列 MVC模式(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller)。

只是作為自己的技術記錄部落

原文連結 什麼是模組化開發? 前端開發中,起初只要在script標籤中嵌入幾十上百行程式碼就能實現一些基本的互動效果,後來js得到重視,應用也廣泛起來了,jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得前端開發得到重視,也使得前端專案越來越複雜

移動通訊技術發展歷程及未來趨勢

1978年,美國貝爾實驗室研製出先進行動電話系統(AMPS)。此後,其它工業化國家相繼開發出蜂窩式行動通訊網。對於靠模擬通訊的1G時代來說,這一技術是一個重大的突破,從此行動通訊開始得到了飛速的發展。時至21世紀,行動通訊標準從1G發展到2G、3G以及到現在普遍流行的4G,

部落磚家及技術團隊部落收藏,github開源

> 阿里巴巴技術團隊部落格: 一起解決技術難題,提升系統性能,完成業務突破,構建新的應用,玩兒轉技術、業務、資料、無線。 阿里巴巴分散式服務框架 Dubbo 團隊成員樑飛專訪  - http://www.iteye.com/magazines/103  測試團隊:ht

技術人生-部落、網站、論壇推薦

部落格: 網站: 網際網路知名部落格推薦: 1、雷鋒網(www.leiphone.com):網站創辦時間:2011年,創始人:林軍 雷鋒網是一家關注智慧硬體行業的網際網路科技媒體,除了一些比較前言

技術團隊部落大全

國內技術團隊部落格1  http://tech.meituan.com/ 美團點評技術團隊2  http://fe.meituan.com/   美團前端技術團隊3  http://tech.uc.cn/       UC技術團隊4  http://tencentdba.c

從淘寶架構之cookie跨域,看網際網路技術發展方向

       最近在發現使用Taobao的時候的一個小細節,於是便萌發起了寫這篇文章。  當我們在 www.taobao.com 中進行登入之後,然後直接切換到 www.tmall.com 域名下,發現www.tmall.com首頁的最頂部馬上顯示成了: 您好, and

西濤offbye-移動全棧技術部落

一個成熟的中大型組織中,專業人員會有不同序列技術級別上升通道,比如騰訊及百度的T系列,阿里的P系列等。一些公開介紹的騰訊職級情況如下。騰訊的職級系統有26個職業通道,如果你是一個一張白紙,沒有任何職業能力的畢業生,可以從這個26個通道,比如行政、財務、設計、運維、開發、運營、

西濤offbye-移動全棧技術部落(關於移動端架構和全棧開發,Android, HTML5,Swift,前端,人工智慧,技術管理等)

Hybrid HTML5跨平臺移動應用開發技術 Hybrid HTML5跨平臺移動應用開發技術,使用AngularJS,ionic Framework,PhoneGap開發跨平臺移動應用,技術和經驗分享。本專欄每月更新4篇以上

【陳永鵬Yoperchen的專欄】陳永鵬Yoper的技術部落

歡迎關注我時不時就瞎吐槽的個人公眾號零零糖,一個軟體工程師每天晚上陪你在枕邊聊天就問你怕不怕 非非影視 性零堂 廣州php交流 QQ群370648191(已滿) 廣州PHP交流 QQ群201923866(已滿) PHP/前端QQ群320205320PHP技術交流群180460365網站運營交流 Q