1. 程式人生 > >Linux (Ubuntu 12.04)環境下編寫JNI

Linux (Ubuntu 12.04)環境下編寫JNI

引言

Java 的出現給大家開發帶來的極大的方便。但是,如果我們有大量原有的經過廣泛測試的非 Java 程式碼,將它們全部用 Java 來重寫,恐怕會帶來巨大的工作量和長期的測試;如果我們的應用中需要訪問到特定的裝置,甚至是僅符合公司內部資訊互動規範的裝置,或某個特定的作業系統才有的特性,Java 就顯得有些力不從心了。面對這些問題,Sun 公司在 JDK1.0 中就定義了 JNI 規範,它規定了 Java 應用程式對本地方法的呼叫規則。

實現步驟及相關函式使用

java訪問C/C++有6步:

  1. 定義一個 Java 類 – Hello. java它提供 SayHello 方法(.java)
  2. 編譯java生成class (.class)
  3. 生成C/C++標頭檔案 (.h)
  4. 根據標頭檔案編寫C/C++實現體 (.cpp)
  5. 編譯生成dll(Window下)或so檔案(linux) (.so)
  6. 執行java程式

例程

1.定義一個 Java 類 – TestJin. java它提供 SayHello 方法

    com.test.jni; //包名必須有,此java檔案最好由安卓編寫器生成。    
    import java.util.*;
    public class TestJni
    {
        public native void sayHello
(String name); static { System.loadLibrary("TestJni"); } }
PS: 上面的方法都用到了native關鍵字。
    System.loadLibrary("Sample1");這句中"Sample1"是我們在第5步中得到的庫的名字,在window下是"Sample1.dll",在unix下要加字首"lib",即"libSample1.so" 。

2.編譯java生成class

使用命令:javac TestJin.java

無錯生成TestJin.class檔案

3.生成C/C++標頭檔案

使用命令:javah -jni com.test.jni.TestJin //包名+類名

生成 com_test_jni_TestJin.h

PS:此檔案最好使用編輯軟體eclipse生成。

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

#ifndef _Included_c
#define _Included_com_test_jni_TestJin
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_jni_TestJin
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_test_jni_TestJin_1c
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

4.根據標頭檔案編寫C/C++實現體

TestJin.c/TestJin.cpp:

兩個差別就是JNIEnv這個類

C中使用 jsize len = (*env)->GetArrayLength(env,array);

C++中使用 jsize len = env->GetArrayLength(env,array);

#include <jni.h>
#include "com_test_jni_TestJin.h"

// 從 instring 字串取得指向字串 UTF 編碼的指標
//注意C語言必須(*env)->         C++ env->
JNIEXPORT jint JNICALL Java_com_test_jni_TestJin_1c
  (JNIEnv *env, jobject obj, jstring str){

}

5.生成共享庫檔案

編譯TestJin.c/TestJin.cpp檔案

gcc -fPIC -D_REENTRANT -I/usr/lib/sunJVM/JDK/jdk1.6.0_45/include

-I/usr/lib/sunJVM/JDK/jdk1.6.0_45/include/linux -c *.cpp

編譯用到了jdk include中jni.h,include/linux中jni_md.h兩個標頭檔案

/usr/lib/java/include 是jin.h路徑

/usr/lib/java/include、linux 是jni_md.h路徑

此時生成TestJin.o檔案

執行:gcc -shared *.o -o libICTCLAS.so 生成libTestJin1.so

注:
有android 原始碼的情況下在,可在android環境中使用mm 編譯得出 .so 庫。

6.執行java程式

libTestJin1.so檔案拷貝到java的載入庫LD_LIBRARY_PATH指向的路徑中:

如果沒有足夠許可權,可以這樣:

(1).在/home下建立一個用來存放.so庫檔案的目錄,比如/home/xxx/lib

(2).把libTestJin1.so檔案拷貝到該目錄下

(3).執行:export LD_LIBRARY_PATH=/home/xxx/lib (只在當前shall下有效…)

現在執行java TestJin1

相關推薦

Linux Ubuntu 12.04環境編寫JNI

引言 Java 的出現給大家開發帶來的極大的方便。但是,如果我們有大量原有的經過廣泛測試的非 Java 程式碼,將它們全部用 Java 來重寫,恐怕會帶來巨大的工作量和長期的測試;如果我們的應用中需要訪問到特定的裝置,甚至是僅符合公司內部資訊互動規範的裝置,或

LinuxUbuntu 16.04環境安裝

Linux 環境安裝 apt-get命令詳解 sudo apt-get update 安裝任何軟體之前,最好更新本地軟體包索引 sudo apt-get upgrade 該命令會告訴你哪些軟體包需要更新 並請求更新 sudo apt-

LinuxUbuntu 16.04中安裝OpenCV + OpenCV_Contrib

dep bsp blog pil 目錄文件 mod see dea spa   近兩個月來接觸了Linux系統,在老板的建議下翻了Ubuntu的牌子,我安裝的版本是16.04,用習慣之後感覺蠻好的,比Windows要強。好啦,廢話不說啦,下面開始說在Ubuntu中安裝Ope

64位作業系統安裝——LinuxUbuntu 16.04+Windows7+iNode

本篇文章主要總結了Ubuntu16單系統和虛擬機器安裝,Windows7系統的安裝,以及相應系統中iNode校園網客戶端的安裝。 目錄 通過製作U盤啟動來安裝Ubuntu 16.04系統 一、製作U盤啟動器 二、U盤安裝Ubuntu16單系統 三、安裝校園網客戶端iNode(根據

LinuxUbuntu 16.04搭建ftp伺服器(最簡單版)

原文地址:https://blog.csdn.net/null_qiao/article/details/76919234?locationNum=2&fps=1Linux(Ubuntu 16.04)搭建ftp伺服器最簡單版ftp伺服器搭建過程測試上傳、下載功能遇到的

Linux Ubuntu 18.04終端執行 Matlab 指令碼

命令如下: matlab -nodesktop -nosplash -nojvm -r 'mytest;quit;' mytest.m是指令碼檔案,命令裡面好像加上“.m”字尾不行。 按照以上方式可以直接執行指令碼進行有關計算,不會彈出Matlab的介面。這麼做其實主要

LinuxUbuntu/openSUSE/CentOS配置ASP.NETApache + Mono

configure serve cin mono head 服務器 決定 文章 pen 【題外話】 閑的無聊竟然想嘗試測試自己做的項目在不同操作系統上的性能表現,所以決定試試在Linux上部署Apache和Mono的環境。由於平時很少接觸Linux,所以從網上找了幾

Linux軟體之如何更換軟體源?阿里源Ubuntu 16.04

文章目錄 1. 找到並備份配置檔案sources.list 2. 修改配置檔案sources.list 阿里源Ubunt16.04(xenial)版本 3. 更新源 + 更新軟體

WPS for Linux字型配置Ubuntu 16.04

錯誤提示: 解決方法: 提示:以下方式任選一個 1、解壓 sudo unzip wps_symbol_fonts.zip -d /usr/share/fonts/wps-office 解壓完成後再次開啟WPS就不會看到以上錯誤。 2、注意:一定要以wps-office的資料夾進行儲

Linux系統更改root密碼Ubuntu 16.04

1、開機長按shift,在出現的介面中,選擇*Advanced options for Ubuntu 2、按回車鍵,在出現的介面中,選中有recovery mode的選項,按e鍵,不要按回車鍵! 3、在出現的介面中,找到ro recovery nomodes

02號團隊-團隊任務3:每日立會2018-12-04

2.團隊資訊  團隊序號:02   開發軟體名稱:飛機大戰   今日整理人:邢為屹 學號 2016035107246 團隊職務:專案經理 出席參與人員(七人全部出席) 3 團隊資訊   4.燃盡圖 5. 團隊問題:由於我產品經理(曲洪博

一號團隊-團隊任務3:每日立會2018-12-04

一.基本資訊 團隊序號:一號 開發的軟體名稱:Java教學官網 撰寫人:張浩洋 學號:2016035107283 職務:專案經理 二.團隊彙報 1.彙報文字版 一號團隊全體成員與2018年12月04日在第一組專案群中針對2018年12月03日工作任務進行彙報,彙總文字版如下: 專案經理(張浩

6號團隊-團隊任務4:每日立會2018-12-04

我們是第六組團隊,小組一共7人,我們研發的專案是 《飛機大戰2018》。 小組成員:      張凝:產品經理      張龍宇:UI設計師      張洪銘:軟體測試員兼軟體工程師      張釗:專案經理      張銳:軟體工程師      周群:軟體工程師      趙雨龍:軟體工程師

7號團隊-團隊任務3:每日例會2018-12-04

軟件工程 技術 png div bsp bubuko post 系統 匯報 1、為了對項目進度、項目完成情況進行了解,是項目更好的完成,我們團隊進行了每日例會 2、團隊信息 團隊序號:7號團隊 團隊任務:教師個人題庫系統 團隊成員:產

安裝PCL1.8 與 boost1.58 的衝突問題 Ubuntu 16.04

在按照pcl官網上的Ubuntu16 安裝步驟(https://larrylisky.com/2016/11/03/point-cloud-library-on-ubuntu-16-04-lts/),編譯安裝pcl的原始碼時候,報錯出現如下問題: ../../lib/libpcl_visua

ubuntu 14.04伺服器環境apache2.4配置SSL

最近因為開發微信小程式,需要在服務端搭建https,在網上找了幾篇配置SSL的部落格,感覺都不是特別滿意,感覺這一篇寫的還挺好的。1.查詢apache的SSL模組ubuntu下,apache的預設模組目錄是/usr/lib/apache2/modules/$ cd /usr/

【ejabberd】安裝XMPP伺服器ejabberdUbuntu 12.10

ejabberd ejabberd is a free and open source instant messaging server written in Erlang/OTP.ejabberd is cross-platform, distributed, fault-tolerant, and ba

sudo apt-get update 各種問題!ubuntu 16.04

不知道大家最害怕什麼linux命令,我最最最最害怕的就是 sudo apt-get update命令。我簡直遇到了各種各樣形形色色的問題,甚至有一些是網上找不到原因,最後不知道改了什麼,莫名其妙又好了的問題。氣到肝疼! 今後遇到的apt-get update 問題全都歸納總

KVM虛擬機器顯示卡直通Ubuntu 14.04

對於顯示卡直通,此前我走了很多彎路,在我的博文《我的KVM顯示卡直通實踐》中有過相關記錄,在此就不贅述了,只描述一下配置成功的方法。 配置好顯示卡直通的方法: 1.硬體條件 首先要確定主機板和CPU都支援VT-d技術,即Virtualization

原始碼編譯OpenJdk 8,Netbeans除錯Java原子類在JVM中的實現Ubuntu 16.04

一、前言 前一陣子比較好奇,想看到底層(虛擬機器、彙編)怎麼實現的java 併發那塊。 volatile是在彙編里加了lock字首,因為volatile可以通過檢視JIT編譯器的彙編程式碼來看。 但是原子類,本來在jvm中就是彙編實現的,反而沒法看。如果能實際跟蹤一下斷點,應該也算實際驗證了。 &