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