java jni框架,Java JNI 簡明教程(一)——傳智播客JNI筆記(王澤佑)

package cn.itcast;

public calss TestNative {

public native void sayHello();

public static void main(String[] arg){

}

}```

2. 用javah.exe生成包含native方法的C/C++頭文件

javah -jni(默認)

javah cn.itcast.TestNative //由類名執行生成C/C++頭文件

生成的頭文件內容:JNIEXPORT void JNICALL Java_cn_itcast_TestNative_SayHello (JNIEnv*, jobject)

3. 參照生成的頭文件生成C/C++源文件

在VS下:Win32工程-->DLL-->空的工程-->結束

把生成的頭文件引入到C++工程中,從JDK/include和include/win32中

jni.h和jni_md.h文件,然后創建一個新的C++源文件

```java

#include

#include "cn_itcast_TestNative.h"

JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayHello

(JNIEnv* env, jobject obj){

count<

4. 返回Java寫Java調用dll代碼部分

在主函數中:

System.loadLibrary("nativeCode")//寫入你生成的dll文件名,但不要寫“.dll”java會自動識別Windows還是Linux系統

new TestNative().sayHello();

運行一下,結果:

Hello world

----

##使用JNI的兩個弊端

1. 使用JNI,這個Java Application就不跨平臺了,如果要移植到其他平臺那么native代碼就要重新編寫,編譯。

2. Java是強類型語言,C/C++不是,因此使用JNI要格外小心

**總之,盡量少用JNI**

本地代碼訪問Java代碼

* 在本地調用的C/C++函數中也可以反過來訪問Java程序中的類

* javah工具生成C/C++函數生命中,可以看到兩個參數

> JNI* env 實際上代表了Java環境,通過JNIEnv*指針,就可以對Java端代碼進行操作,例如:創建Java類的對象,調用Java對象的方法,獲取Java對象屬性等

* JNIEnv類中有很多函數可以用。

NewObject/NewString/New Array

Get/SetField

CallMethod /CallStaticMethod 等許多函數某個類型的變量

> jobject* obj 被定義為_jobject

* Java操作對象為引入操作,而C/C++中使用指針對對象操作

* jobject* obj 指向一個Java對象的引用,這個對象引用是Java中Native方法所對應的對象

<1>若native方法非靜態,它指向native方法所對應的實例

<2>若native方法靜態(static)那么它指向native所對應的class對象:Class.class

### Java類型在C/C++中的映射關系

| Java | 本地類型 | JNI定義的別名(jni.h中定義) |

| ------- |:------------------:| -------:|

| int | long | jint/jsize |

| long | _int64 | jlong |

| byte | signed char | jbyte |

| boolean | unsigned char | jboolen |

| char | signed short | jchar |

| short | short | jshort |

| float | float | jfloat |

| double | double | jdouble |

| Object | _jobject* | jobject |

### jclass的取得

typedef _jclass* jclass

為了使C/C++使用Java類,Jni.h頭文件中專門定義了jclass類型表示Java中的class類

JNIEnv類中有如下幾個簡單的函數可以取得jclass:

- jclass FindClass(const char * clsName);

- jclass GetObjectClass (jobject obj);

- jclass GetSuperClass (jclass obj);

Findclass會在classpath系統環境變量下尋找類

傳入完整的類名,注意包與包之間是'/'而不是'.'來分隔

如:jclass cls_string=env->FindClass("Java/lang/String")

C/C++訪問Java端代碼,一個常用的應用就是獲取類的屬性和調用類的方法,為了在C/C++中表示屬性和方法JNI在jni.h頭文件中定義了jfieldID,jmethodID分別代表Java端屬性和方法

我們在訪問或設置Java屬性時,必須先取得代表Java屬性的jfieldID,然后才可以在本地代碼進行Java屬性操作;同樣,需要使用Java端方法時,也是要取得代表該方法的jmethodID才能對Java方法調用。

使用JNIEnv的GetFieldID/GetMethodID GetStaticFieldID/GetStaticMethodID 來取得相應的jfieldID和jmethodID

* 方法原型:GetFieldID/GetStaticFieldID/GetMethodID/GetStaticMethodID(jclass clazz,const char* name,const char* sign)

如:env->GetMethodID(data_clazz,"","()V")

* Sign簽名,用來表示取得的屬性/方法的類型

| 類型 | 相應簽名 |

| ------- |:------------------:|

| boolean | Z |

| byte | B |

| char | C |

| short | S |

| int | I |

| long | L |

| float | F |

| double | D |

| void | V |

| object | L 用“/”分隔包的完整類名;如:Ljava/lang/String; |

| Array(數組) | [Sign 如[L [Ljava/lang/object; |

| Method | (Type)V 若指定“(I)V” 則取回 void function(int)的jmethodID
若指定“(D)V”則取回void function(double)的jmethodID|

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530273.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530273.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530273.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java自定義變量解析,Thymeleaf內置對象、定義變量、URL參數及標簽自定義屬性

如標題所述&#xff0c;這篇文章主要講述Thymeleaf中的內置對象(list解析、日期格式化、數字格式化等)、定義變量、獲取URL的參數和在頁面標簽中自定義屬性的應用。如果對Thymeleaf的基本使用、maven依賴等不清楚的可以先閱讀我的另一篇文章《Thymeleaf 之 初步使用》。Control…

linux php curl.so,linux中php如何安裝CURL擴展方法

如果php已經在系統編譯好&#xff0c;后來又需要添加新的擴展。一種方式就是重新完全編譯php&#xff0c;另一種方式就是單獨編譯擴展庫&#xff0c;以extension的形式擴展。下面以安裝curl擴展為例&#xff1a;1、下載curl安裝包。(我的php是4.4.4的&#xff0c;下載最新的cur…

matlab線性拉伸函數,采用線性變換對圖像的每一個像素灰度作線性拉伸-Read.PPT

采用線性變換對圖像的每一個像素灰度作線性拉伸-Read第4章 圖像增強(1) 4.1 圖像增強概述 圖像增強(image enhancement)的定義&#xff1a; 在圖像的獲取過程中&#xff0c;由于多種因素的影響&#xff0c;導致圖像質量退化。圖像增強是對退化圖像的某些特征&#xff0c;如邊緣…

php js 循環對象屬性,js 遍歷對象的屬性的代碼_javascript技巧

如&#xff1a;Function.prototype.addMethodfunction(methodName,func){if(!this.prototype[methodName]){this.prototype[methodName]func;//給原型增加方法&#xff0c;此方法會影響到該類型的實例上}return this.prototype;//返回原型&#xff0c;此類型實例可以進行鏈形調…

php連接數據庫navicat,navicat數據庫如何連接php

第一步&#xff0c;打開Navicat&#xff0c;新建數據庫。第二步&#xff0c;在數據庫中新建表。相關推薦&#xff1a;《Navicat for mysql使用圖文教程》第三步&#xff0c;保存表。第四步&#xff0c;表中添加數據。第五步&#xff0c;打開ide&#xff0c;輸入以下php代碼&…

每日一題:LCR 095.最長公共子序列(DP)

題目描述&#xff1a; 給定兩個字符串 text1 和 text2&#xff0c;返回這兩個字符串的最長 公共子序列 的長度。如果不存在 公共子序列 &#xff0c;返回 0 。 一個字符串的 子序列 是指這樣一個新的字符串&#xff1a;它是由原字符串在不改變字符的相對順序的情況下刪除某些…

php自動合并,php實現合并數組并去除重復的方法

php實現合并數組并去除重復的方法發布時間&#xff1a;2020-08-12 10:35:05來源&#xff1a;億速云閱讀&#xff1a;99作者&#xff1a;小新這篇文章主要介紹了php實現合并數組并去除重復的方法&#xff0c;具有一定借鑒價值&#xff0c;需要的朋友可以參考下。希望大家閱讀完這…

oracle存儲數據方式,Oracle 數據類型及存儲方式

Oracle 數據類型及存儲方式袁光東 原創概述通過實例&#xff0c;全面而深入的分析oralce的基本數據類型及它們的存儲方式。以ORACLE 10G為基礎&#xff0c;介紹oralce 10g引入的新的數據類型。讓你對oracle數據類型有一個全新的認識。揭示一些不為人知的秘密和被忽略的盲點。從…

oracle的一些基本操作,Oracle中的一些基本操作

關于Oracle中的一些基本操作&#xff0c;包括表空間操作&#xff0c;用戶操作&#xff0c;表操作1 --創建表空間2 create tablespace itheima3 datafile I:\oracle\table\itheima.dbf4 size 100m5 autoextend on6 next 10m;7 --刪除表空間8 drop tablespace itheima;910 --創建…

oracle全局批準供應商,Oracle EBS-SQL (PO-7):檢查異常-非批準的供應商設置供貨比例.sql...

select distinctmsr.sourcing_rule_name 名稱,msi.description 說明,msi.item_type 類型,msi.inventory_item_status_code 狀態,msr.planning_active 計劃生效,msro.effective_date 有…

linux 臨時文件 鎖,linux – 無法使用文件描述符flock鎖定文件

您正在使用-n,如果無法立即獲取鎖定將終止,并且flock將以退出代碼1失敗.因此,在第一個終端中執行代碼后,它會休眠100秒.接下來當你在另一個終端中執行相同的操作時,flock會失敗并返回1,但是因為有一個;并且您不對返回代碼執行任何操作,shell只是繼續執行下一個語句并休眠100秒.…

linux內核運行關系圖,一張圖看懂Linux內核運行交互關系

很多朋友如果接觸過Linux的都知道Kernel的含義&#xff0c;kernel是操作系統的核心或者最重要的部分。眾所周知的是&#xff0c;幾乎整個互聯網都運行在 Linux上&#xff0c;從網絡協議&#xff0c;到服務器&#xff0c;到你平常訪問的絕大多數網站&#xff0c;都能看到它的身…

win7下訪問linux文件權限,linux中文件的權限

一、文件的基本權限權限&#xff1a;r, w, x對于文件來講&#xff0c;r:&#xff1a;可讀&#xff0c;可以使用類似cat等命令查看文件內容&#xff1b;w:可寫&#xff0c;可以編輯或刪除此文件&#xff1b;x:可執行&#xff0c;exacutable&#xff0c;可以命令提示符下當作命令…

linux頭文件怎么編譯,microsoft編譯器怎么使用Linux頭文件

microsoft編譯器如何使用Linux頭文件?#include #include #include #include #include #include #include #include #include #include #include #include #include 分享到&#xff1a;------解決方案--------------------windows 對應 上面頭文件 是哪個呀?引用:一般都是網絡…

linux程序多少位,查看linux版本是多少位

1 查看內核版本&#xff1a;1)[rootLinux download]# cat /proc/versionLinux version 2.6.18-194.el5 (mockbuildbuilder16.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:58:35 EDT 20102)[rootLinux download]# uname -aLinux Linux 2.…

linux內核bios,BIOS的啟動原理——Linux內核設計學習筆記

RAM&#xff1a;隨機存取存儲器&#xff0c;常見的內存條就是一類RAM&#xff0c;其特點是加電狀態下可任意讀、寫&#xff0c;斷電后信息消失。在RAM中什么程序也沒有的時候&#xff0c;誰來完成加載軟盤中操作系統的任務呢&#xff1f;答案是&#xff1a;BIOS。BIOS的啟動原理…

zabbix監控linux網卡流量,zabbix實現linux流量變化率監控

監控軟件&#xff1a;zabbix需求分析&#xff1a;從系統層面的監控看&#xff0c;現在CPU持續超過80%會報警&#xff0c;流量曲線達到閥值才會報警&#xff0c;但是流量在短時間內起伏很大&#xff0c;肯定是有問題的&#xff0c;目前主要還是依靠人看&#xff0c;肯定有滯后性…

Linux下仿windows任務管理器,開源任務管理器 Process Hacker (Windows)

Windows表面上沒有工作在進行中&#xff0c;但不知為何負荷很重&#xff0c;究竟有什么進程在執行&#xff1f;會不會是系統已經被入侵&#xff1f;這是很多人都想知道的問題。但Windows自帶的任務管理員實在太過簡陋&#xff0c;解決辦法便是安裝這次介紹的Process Hacker。熟…

linux軟件工程師筆試題,C/C++軟件工程師筆試題

1&#xff0c;程序設計(可以用自然語言來描述&#xff0c;不編程)&#xff1a;C/C源代碼中&#xff0c;檢查花括弧(是“(”與“)”&#xff0c;“{”與“}”)是否匹配&#xff0c;若不匹配&#xff0c;則輸出不匹配花括弧所在的行與列。2&#xff0c;巧排數字&#xff0c;將1,2…

嵌入式linux中的鎖機制,跟濤哥一起學嵌入式第11集:一個實現鎖機制非常有意思的宏...

QQ群(宅學部落)有位學員問了一個很奇怪的宏&#xff0c;覺得很有意思&#xff0c;特拿來分享&#xff0c;它的定義如下:我們知道&#xff0c;宏定義其實就是為了方便&#xff0c;給一串代碼字符串定義一個別名。有時候字符串過于復雜&#xff0c;我們可以分多行書寫&#xff0c…