JNI基本數據類型

2021-03-02 極客Furzoom

本文是JNI系列的第二篇,介紹JNI中的基本數據類型,以及Java和native的傳遞約定。

系列文章的大綱如下:

JNI中的基本數據類型

JNI中的基本類型也稱為Native基本類型。

在Java中的基本類型與JNI中的基本類型的對應關係如下:

Java類型Native類型說明booleanjbooleanunsigned 8 bitsbytejbytesigned 8 bitscharjcharunsigned 16 bitsshortjshortsigned 16 bitsintjintsigned 32 bitslongjlongsigned 64 bitsfloatjfloat32 bitsdoublejdouble64 bitsvoidvoidN/A

在Native中定義了jboolean的兩個取值:

#define JNI_FALSE 0
#define JNI_TRUE 1

同時還定義jsize類型用於處理索引以及大小:

typedef jint jsize;

以上就是native中的基本類型,以及與Java中基本類型的對應關係,下面就一起來看看如何在Java與native中進行傳遞吧!

傳遞基本類型參數

在JNI簡介中完整的介紹了如果在Java中調用native中的函數。但是並沒有傳遞參數。在Java與native間傳遞基本數據類型是十分簡單而又直接的,在Java的native方法的參數和返回值,在生成的頭文件的函數籤名中使用上一節介紹的對應的native類型進行替換,在C/C++的實現中直接使用即可。

實例

我們來看一個實例。

Hello.java

package myjni;

public class Hello {
static {
System.loadLibrary("hello");
}

public native short addShort(short a, short b);

public static void main(String[] args) {
Hello hello = new Hello();
short a = 1;
short b = 2;
System.out.println("addShort(" + a + ", " + b + ") = " + hello.addShort(a, b));
}
}

如果還不清楚如果生成頭文件請參考JNI簡介和使用IntelliJ IDEA和CLion開發JNI環境搭建。

生成頭文件myjni_Hello.h的籤名為:

/*
* Class: myjni_Hello
* Method: addShort
* Signature: (SS)S
*/
JNIEXPORT jshort JNICALL Java_myjni_Hello_addShort
(JNIEnv *, jobject, jshort, jshort);

實現函數Java_myjni_Hello_addShort:

JNIEXPORT jshort JNICALL Java_myjni_Hello_addShort(JNIEnv *env, jobject obj, jshort ja, jshort jb) {
jshort ret = ja + jb;
return ret;
}

編譯生成動態庫,並運行Java程序得到輸出:

addShort(1, 2) = 3

傳遞其他數據類型也是一樣的操作。注意如果返回true或者false,在native代碼中直接使用JNI_FALSE或者JNI_TRUE。

類型籤名

在生成的頭文件中,函數會有如下的注釋:

/*
* Class: myjni_Hello
* Method: addShort
* Signature: (SS)S
*/

Class和Method的值很容易理解,Signature的值(SS)S是什麼含義呢?

這其實是JVM中的類型的表示方法,有如下對應關係:

類型籤名Java類型ZbooleanBbyteCcharSshortIintJlongffloatDdoubleVvoidLfully-qualified-class;fully-qualified-class[typetype[](arg-types)ret-typemethod type

上表中單個大寫字母很好理解,其中的V用於函數返回值。

對於fully-qualified-class,看例子來理解,Java中的String類型的類型籤名為Ljava/lang/String;,開頭為L,結尾是;。

對於Java中的數組,如int[],類型籤名為[I。

最後一個表示方法的籤名,如(SS)S,表示函數參數是兩個short類型,返回值是short。

括號內SS是函數的參數類型,括號外的S是函數的返回值類型。

如Java中的方法:

long f (int n, String s, int[] arr);

類型籤名為:

(ILjava/lang/String;[I)J

本文完。

相關焦點

  • JNI-Thread中start方法調用與run方法回調分析
    1.JNI機制的基本使用當我們new出一個Thread的時候,僅僅是創建了一個java層面的線程對象,而只有當Thread的start方法被調用的時候,一個線程才真正開始執行了。、返回類型等,但不包含實現,類似java中的接口,而java代碼正是通過這個「接口」找到真正需要執行的方法。
  • Android JNI中的異常處理 與Log日誌使用2步驟
    而在jni 中使用日誌就只需要2步驟。步驟一:引入頭文件 ,include log.h步驟二 定義宏。結果:JNI異常處理異常處理是java 程序設計中的重要功能,java 中 拋出一個異常,虛擬機停止執行代碼並且調用棧反向檢查能處理特定的異常類型處理程序代碼塊,叫做捕獲異常。
  • java基礎之理解JNI原理
    在此總結了下面這個知識圖:實例:環境說明:ubuntu 10.4.2 LTS系統程序清單1:src/com/magc/jni/HelloWorld.java/** *  */ package com.magc.jni; /** * @author magc
  • Java基本數據類型
    接觸每種語言的時候,都會存在數據類型的認識,有複雜的、簡單的,各種數據類型都需要在學習初期去了解,Java是強類型語言,所以Java對於數據類型的規範會相對嚴格。數據類型是語言的抽象原子概念,可以說是語言中最基本的單元定義,在Java裡面,本質上講將數據類型分為兩種:基本類型和引用數據類型。
  • Java基本數據類型與引用數據類型概述
    內存管理系統根據變量的類型為變量分配存儲空間,分配的空間只能用來儲存該類型數據。什麼是進位?進位是一種進位方法。 對於任何一種進位--X進位,就表示某一位置上的數運算時逢X進一位。以0x開頭 【16 = 10】注意:只有JDK1.7版本以上可以使用0b2 來表示二進位基本數據類型分類(4類8種)整數型:byte 佔一個字節 -2^7 ~ 2^7-1【-128~
  • 音視頻開發之旅(17) JNI與NDK的學習和使用
    *Java需要的是String類型,為什麼JNI返回的是一個jstring類型?extern "C" 是什麼意思?JNIEXPORT和JNICALL又是什麼意思?這涉及到JNI的基本知識,我們通過對JNI基本知識的學習來解決上面的疑惑。
  • Java基本數據類型的簡單介紹
    各位小夥伴們大家好,這次小編要介紹的是java的基本數據類型,其實之前寫常量的時候,就已經提到了數據類型。數據類型主要分為兩種,一種是基本數據類型,第二種是引用數據類型。小編這次要介紹的是基本數據類型。
  • 「乾貨」基本數據類型和引用數據類型的區別
    背景新語言Kotlin已經拋棄了Java裡的基本數據類型,而是採用引用類型去聲明一個變量,那麼怎麼區分基本數據類型和引用類型呢?文字概念基本數據類型:byte、short、int、long、float、double、char、boolean引用類型:類(class)、接口(interface)、數組(array
  • Java的八種基本數據類型是哪些
    任何程式語言都離不開數據結構,java也不例外,在java的世界裡,數據都有自己的數據類型,而且不同的數據類型有不同的特性。概念Java 語言是一種強類型語言。第一、所有的變量必須先聲明、後使用。那我們就通俗點說,在 Java 中存儲的數據都是有類型的,而且必須在編譯時就確定其類型。
  • Java通過-jni調用c語言
    TestJNI test=new TestJNI();             test.set(1);             System.out.println(test.get());                  }}      (2)用javac編譯TestJNI.java文件生成TestJNI.class文件(3)用javah帶-jni
  • go基本數據類型
    介紹go語言中的數據類型,常見的有整形、浮點型、布爾型、字符串,除此外還有數組、切片、結構體
  • 大數據語言,Java的八大基本數據類型
    Java中的數據類型,分為引用類型和基本數據類型。基本類型又分為8種,今天為大家介紹這8種基本數據類型:整型:byte,short,int,long浮點型:float,double字符型:charBoolean型:boolean1.整數類型
  • JVM 解剖公園:JNI 臨界區與 GC Locker
    (給ImportNew加星標,提高Java技能)編譯:ImportNew/唐尤華shipilev.net/jvm/anatomy-quarks/9-jni-critical-gclocker
  • Python基礎——基本數據類型(1)
    基本數據類型(Number篇)先給大家看一下基本數據類型的分類,這裡我做了一個簡單的思維導圖 Python3
  • java之ArrayList集合存儲基本數據類型
    各位小夥伴們大家好,這次小編要介紹的是,在ArrayList集合當中,基本數據類型的存儲,在之前的文章中小編有提到過,ArrayList集合只能存儲引用數據類型,其實也可以存儲基本數據類型。在ArrayList集合當中,如果要存儲基本數據類型需要用到基本數據類型相對應的包裝類(包裝類是引用數據類型,位於java.long包下,不需要導包)。小編先插入一個表格,來介紹基本數據類型與包裝類的對應關係。小編覺得,關於基本數據類型相對應的包裝類,其實大部分只需要首字母大寫就可以。int型還有char型比較特殊,這兩個需要大家簡單記一下。
  • 第四篇:JavaScript基本數據類型
    JavaScript基本數據類型有String(字符串類型)、Number(數字類型)、Boolean(布爾類型)、Array(數組類型)、Date(日期類型)。不同於Java語言,JS 語言是弱數據類型,聲明變量時不需要說明數據類型,JS解釋器會自動根據變量的值賦予變量對應的數據類型。
  • Python基礎教程02:基本數據類型
    教程內容本文主要講述簡單的數據類型以及賦值。變量不需要聲明Python的變量不需要聲明,你可以直接輸入:那麼你的內存裡就有了一個變量a, 它的值是10,它的類型是integer (整數)。 在此之前你不需要做什麼特別的聲明,而數據類型是Python自動決定的。
  • 一文讀懂Java基本數據類型
    在Java中的數據類型,分為引用類型和基本數據類型。本文主要講解8種基本數據類型,引用類型將在面向對象中詳細講解。在8種基本數據類型中整型有4種:byte,short,int,long;浮點型有2種:float,double;字符型有1種:char;布爾型有一種:boolean。
  • Java基礎學習:java中的基本數據類型
    一、基本類型 1、基本類型 不使用New創建,聲明一個非引用傳遞的變量,且變量的值直接置於堆棧中,大小不隨運行環境變化,效率更高。使用new創建的引用對象存儲在堆中。
  • Python的基本數據類型之一:數字(Number)
    圖片來自於網絡在Python中,基本數據類型主要可分為以下幾種:數字(Number列表(List);字典(Dictionary);元組(Tuple);今天我們深入探討一下數字(Number)這種數據類型