如何實現Java端和Native端的簡單資料互動
在《在java中如何使用native函式》一文中,講述了java中native函式的使用方法,其中,列舉的例子中,原生函式並沒有帶任何引數,也沒有返回任何引數。那如果原生函式需要帶一些引數或者需要返回一些引數,那又該如何實現呢?
我們知道,在java中之所以能夠呼叫native函式,這主要由JNI機制來保證。
要回答本文開始提到的問題,就必須瞭解JNI機制的實現原理。
一、JNI機制的簡單介紹
在java中呼叫由其他語言如C編寫的函式,其需要解決的問題之一就是型別差異問題。
我們知道,java與C/C++中的資料型別並不一樣,比如,在java中,呼叫native介面,如果該介面在java端傳遞一個
那該如何實現對Java和C/C++資料型別的適配呢,這主要是通過一個型別匹配表來實現:
基本資料型別的匹配表:
複合資料型別匹配:
注意:
1、JNI機制會根據上述匹配表將java端的資料型別對映為JNI資料型別
2、JNI中資料型別都以字母j開頭
3、JNI中的基本資料型別可以和C/C++中對應的基本資料型別互換,即可以直接在C/C++ 中直接使用
4、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的一些介面來做資料 型別的轉換,比如對於字串型別,就是GetStringUTFChars和NewStringUTF。
相關推薦
如何實現Java端和Native端的簡單資料互動
在《在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的java和python分別作為客戶端和服務端的調用實現
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 <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 實現 client端和server端通訊
客戶端 1.建立客戶端+埠 2.準備資料 3.打包(傳送的地點及埠) 4.傳送 5.釋放 服務端 1.建立服務端+埠 2.準備接受容器 3.封裝成包 4.接受資料 5.分析資料 6.釋放 client.java package UdpDe