1. 程式人生 > >如何實現Java端和Native端的簡單資料互動

如何實現Java端和Native端的簡單資料互動

在《在java中如何使用native函式》一文中,講述了javanative函式的使用方法,其中,列舉的例子中,原生函式並沒有帶任何引數,也沒有返回任何引數。那如果原生函式需要帶一些引數或者需要返回一些引數,那又該如何實現呢?

我們知道,在java中之所以能夠呼叫native函式,這主要由JNI機制來保證。

要回答本文開始提到的問題,就必須瞭解JNI機制的實現原理。

一、JNI機制的簡單介紹

java中呼叫由其他語言如C編寫的函式,其需要解決的問題之一就是型別差異問題。

我們知道,javaC/C++中的資料型別並不一樣,比如,在java中,呼叫native介面,如果該介面在java端傳遞一個

String型別的資料,而在C端,並不認識由Java端傳遞過來的資料型別,這樣,JNI必須實現:對JavaC/C++資料型別的適配,也就是JNIJava端和C/C++端起到了一個橋樑的作用。

那該如何實現對JavaC/C++資料型別的適配呢,這主要是通過一個型別匹配表來實現:

基本資料型別的匹配表:

複合資料型別匹配:

注意:

1、JNI機制會根據上述匹配表將java端的資料型別對映為JNI資料型別

2、JNI中資料型別都以字母j開頭

3、JNI中的基本資料型別可以和C/C++中對應的基本資料型別互換,即可以直接在C/C++ 中直接使用

4、JNI中複合資料型別不能在

C/C++程式碼中直接使用,必須通過JNI的相關介面來轉換為

C/C++中相應的資料型別,如可以使用JNI介面GetStringUTFChars來將JNI的複合數 據型別jstring轉換為C/C++中的字串

二、例子:在java中呼叫帶引數的native函式

這裡,我們只寫出java端的程式碼和相應的C端的實現程式碼,具體步驟可見《在java中 如何使用native函式》。

Java端程式碼(檔名為testJniWithPara.java):

class testJniWithPara

{

//native函式:將引數所表示的字串由大寫字母轉換為小寫字母並返回

    public native static String myToLower(String upper);

    static

    {

System.loadLibrary("toLower");

    }

    public static void main(String args[])

    {

System.out.println("I'm in Java, the return string form C is : " + myToLower("THIS IS FROM JAVA!"));

    }

}

C端程式碼(檔名為testJniWithPara.c):

#include <stdio.h>

#include <string.h>

#include <ctype.h>

#include "testJniWithPara.h"

JNIEXPORT jstring JNICALL Java_testJniWithPara_myToLower

  (JNIEnv *env, jclass clazz, jstring param)

{

//java端,該native函式宣告時,引數為String型別,而這裡,已經變為了

//jstring型別,這都是JNI根據型別匹配錶轉換的

//由於這裡傳遞的是複合資料型別,在C中不能直接使用,而需要使用JNI提供的 //方法GetStringUTFChars來將JNI資料型別轉換為C中相應的資料型別

    const jbyte *str = (const jbyte*)env->GetStringUTFChars(param, NULL);

    if (NULL == str)

    {

        printf("error, when calling GetStringUTFChars/n");

    return NULL;

    }

    printf("I'm in C, the param from java is : %s/n", str);

//大寫字母轉換為小寫字母

    char buf[256];

    strcpy(buf, (const char*)str);

    int i, len = strlen(buf);

    for (i = 0; i < len; i++)

    {

buf[i] = (char)tolower((int)buf[i]);

    }

//字串str使用完畢之後需要呼叫JNI介面ReleaseStringUTFChars釋放掉

    env->ReleaseStringUTFChars(param, (const char*)str);

//呼叫JNI介面NewStringUTF將轉換後的字串返回到Java

    return env->NewStringUTF(buf);

}

這樣,就實現了資料在Java端和C端的相互傳遞,當然,這裡只是演示了String型別 資料的互動,其他複合資料型別的互動也類似。主要需要用到JIN的一些介面來做資料 型別的轉換,比如對於字串型別,就是GetStringUTFCharsNewStringUTF

相關推薦

如何實現JavaNative簡單資料互動

在《在java中如何使用native函式》一文中,講述了java中native函式的使用方法,其中,列舉的例子中,原生函式並沒有帶任何引數,也沒有返回任何引數。那如果原生函式需要帶一些引數或者需要返回一些引數,那又該如何實現呢? 我們知道,在java中之所以能夠呼叫native函式,這主要由JNI機制來保

Java實現RabbitMQ客戶消費者簡單例項

1、定義RabbitMQ是流行的開源訊息佇列系統,用erlang語言開發。RabbitMQ是AMQP(高階訊息佇列協議)的標準實現。幾個概念說明:(1)Broker:簡單來說就是訊息佇列伺服器實體。(2)Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。(3

Java review--NIO例項:實現服務客戶簡單通訊

客戶端程式碼: package nio; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.Byte

基於thrift的javapython分別作為客戶服務的調用實現

Coding except arr pes com ssa utf-8 encoding 中文亂碼 前面已經實現了純java的thrift的實現。 現在實現實現一下python作為客戶端和服務端的thrift的調用 1.python作為客戶端,java作為服務端 java服

Netty實現客戶服務通信簡單例子

啟動服務 ali tty 過程 等等 服務器初始化 讀寫操作 extends ask Netty是建立在NIO基礎之上,Netty在NIO之上又提供了更高層次的抽象。 在Netty裏面,Accept連接可以使用單獨的線程池去處理,讀寫操作又是另外的線程池來處理。 Accep

Python學習筆記1:簡單實現ssh客戶服務

bsp dev bre 客戶端 break 基於 bin listen 客戶 實現基於python 3.6。 server端: 1 __author__ = "PyDev2018" 2 3 import socket,os 4 server = socket.s

linux網絡編程之用socket實現簡單客戶服務的通信(基於UDP)

服務端 msg ets lin fgets err n) stderr tcp 單客戶端和服務端的通信(基於UDP) 代碼 服務端代碼socket3.c #include<sys/types.h> #include<sys/socket.h>

基於jrtplib實現的最簡單服務客戶

使用Jrtplib庫實現服務端和客戶端通訊 程式碼都是直接從jrtplib自帶例子中摳出來的,就是為了方便研究,話不多說直接上菜 服務端程式碼: /* Here's a small IPv4 example for receiver */ /* #incl

Socket TCP 協議實現服務客戶簡單通訊-結合線程池的使用

文章目錄 前言 當前模式的弊端 服務端程式碼 客戶端程式碼 執行結果 客戶端 服務端

使用vue實現簡單鍵盤,支持移動pc

gif dem 光標 amp ase onf agen slice borde 常看到各種app應用中使用自定義的鍵盤,本例子中使用vue2實現個簡單的鍵盤,支持在移動端和PC端使用,歡迎點贊 實現效果: Keyboard.vue &lt;template&am

nodejs socket實現的服務客戶簡單通訊

                        本文例項講述了通

socket通訊:客戶伺服器的簡單實現

什麼是socket? socket最開始的含義是一個地址和埠對(ip, port)。Socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求。 socket地址API:它唯一的表示了使用tcp通訊的一端,也可以將其理解成socket地址。 socket

python實現一個簡單的thirft客戶服務

建立thrift檔案 service Hello { string get() } 使用thrift 建立服務需要的元件 thrift --gen py hello.thrif

JAVA中Socket服務客戶網路通訊簡單案例

一. 簡單介紹下Socket的用途: 1.Java最初是作為網路程式語言出現的,其對網路提供了高度的支援,使得客戶端和伺服器的溝通變成了現實,而在網路程式設計中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相關的技術 2.IP地址+埠號組成了所

利用python實現簡單的socket服務客戶

服務端: #!/usr/bin/python3 #python version 3.7 import socket so = socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_TCP) address = ("127

linux網路程式設計之用socket實現簡單客戶服務的通訊(基於TCP)

一、介紹基於TCP協議通過socket實現網路程式設計常用API 1、讀者如果不是很熟悉,可以先看我之前寫的幾篇部落格,有socket,地址結構的理解,更加方便讀者理解 地址分別是: 2、socket(TCP)程式設計API簡介 1)、socket int s

linux網路程式設計之用socket實現簡單客戶服務的通訊(基於UDP)

1、sendto和recvfrom函式介紹 sendto(經socket傳送資料) 相關函式 send , sendmsg,recv , recvfrom , socket 表頭檔案 #include < sys/types.h >#includ

java-基本的Socket程式設計-實現伺服器客戶通訊

基本的Socket程式設計: 本例項介紹Socket程式設計的基本步驟。啟動Socket服務後,再開啟Socket刻畫段,在輸入框中輸入訊息,然後傳送給伺服器端,伺服器端將收到的訊息返回到客戶端。 關鍵技術: Socket程式設計的關鍵技術如下; —–S

Socket程式設計服務客戶互相通訊,實現簡單的聊天

客戶端兩個執行緒分別記錄讀和寫,服務端兩個執行緒分別記錄讀和寫; 客戶端程式碼: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import

Java】udp 實現 clientserver通訊

客戶端  1.建立客戶端+埠  2.準備資料  3.打包(傳送的地點及埠)  4.傳送  5.釋放   服務端  1.建立服務端+埠  2.準備接受容器  3.封裝成包  4.接受資料  5.分析資料  6.釋放  client.java package UdpDe