亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用JNI集成java與native程序

系統(tǒng) 2030 0


當(dāng)我們開始接觸JNI但是還不熟悉的時(shí)候,也許會(huì)這樣幾個(gè)問題:

  1. Java程序和native程序的數(shù)據(jù)類型通常是不一樣的,它們?cè)趺聪嗷ビ成涞哪兀?
  2. 怎么在native方法中訪問java方法傳遞過來的數(shù)據(jù)呢?
  3. 在native方法中可以創(chuàng)建java對(duì)象嗎?
  4. 如何把結(jié)果返回給調(diào)用它的java方法?

讀完本文你將會(huì)明白如上問題的來龍去脈。首先我在重復(fù)一下如何編寫JNI相關(guān)的應(yīng)用程序,我們必須在java方法中聲明一個(gè)native的方法,比如 public native String getLine(String prompt);這個(gè)方法具有的兩個(gè)特點(diǎn)是,引入了關(guān)鍵字native,它的意思是這個(gè)方法的實(shí)現(xiàn)由其他的語言實(shí)現(xiàn),比如c/c++等。另外這個(gè)方法是以 分號(hào)結(jié)尾的,表明這個(gè)方法不包括實(shí)現(xiàn)。我們?cè)谏掀恼乱呀?jīng)知道使用javah命令可以得到我們需要的header文件。下面給出java程序和相關(guān)的.h 文件的代碼

//Prompt.java
class Prompt {
private native String getLine(String prompt);
public static void main(String args[]) {
Prompt p = new Prompt();
String input = p.getLine("Type a line: ");
System.out.println("User typed: " + input);
}
static {
System.loadLibrary("prompt");
}
}

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

#ifndef _Included_Prompt
#define _Included_Prompt
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Prompt
* Method: getLine
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_Prompt_getLine
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

我們可以看到在Prompt.h文件中定義了我們要實(shí)現(xiàn)的函數(shù)的原型,我們主要關(guān)心兩點(diǎn)一個(gè)是方法名稱另一個(gè)是方法的參數(shù),方法的名稱為Java_Prompt_getLine,它是由如下四部分組成

看看方法的參數(shù),由三個(gè)參數(shù)組成分別是JNIEnv *, jobject, jstring。JNIEnv是一個(gè)JNI接口指針,它事實(shí)上是由函數(shù)表組成的,我們可以使用JNIEnv來訪問java對(duì)象。jobject是當(dāng)前類的 的引用,想當(dāng)與java中的this。最后一個(gè)參數(shù)是jstring,代表了我們java方法中的String prompt。

在編寫native方法的時(shí)候,無論是java基本類型還是對(duì)象我們都不能在c/c++中直接使用,必須要轉(zhuǎn)成相對(duì)應(yīng)得類型,下面給出基本數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系。

?

Java Type Native Type Size in bits
boolean jboolean 8, unsigned
byte jbyte 8
char jchar 16, unsigned
short jshort 16
int jint 32
long jlong 64
float jfloat 32
double jdouble 64
void void n/a

關(guān)于java對(duì)象,JNI都是把它映射為jobject,為了減少編程的錯(cuò)誤可能性,同時(shí)從jobject中實(shí)現(xiàn)了一些子類型,比如jstring等。

下面我們講述,如何在native方法中訪問java方法的參數(shù),如何在native方法中創(chuàng)建java對(duì)象。我們必須清楚地知道,在訪問java參數(shù)的 時(shí)候,首先要把它轉(zhuǎn)換為相應(yīng)的類型,比如參數(shù)String prompt在.h文件中為jstring。但是在實(shí)現(xiàn)這個(gè)方法的時(shí)候,我們不能直接對(duì)jstring進(jìn)行操作,因?yàn)樗cchar *是不同的,我們要通過JNIEnv提供的方法把它轉(zhuǎn)換為char *。比如
char buf[128];
const char *str = env->GetStringUTFChars(prompt, 0);
printf("%s", str);
注 意一點(diǎn),我們必須要主動(dòng)釋放我們得到的char *,否則會(huì)造成內(nèi)存泄漏。釋放的方法還是通過JNIenv提供的方法,(*env).ReleaseStringUTFChars(prompt, str);。JNIEnv同樣提供了構(gòu)造String的方法,使得我們可以返回給調(diào)用者一個(gè)String類型的返回值
gets(buf);
return (*env).NewStringUTF(buf);

下面給出native實(shí)現(xiàn)的源代碼(c++代碼)
#include <stdio.h>
#include <jni.h>
#include "Prompt.h"

JNIEXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
{
char buf[128];
const char *str = env->GetStringUTFChars(prompt, 0);
printf("%s", str);
(*env).ReleaseStringUTFChars(prompt, str);
gets(buf);
return (*env).NewStringUTF(buf);
}
在VC++中,你可以創(chuàng)建一個(gè)dll工程,最后把得到的prompt.dll方到Prompt.class的目錄,運(yùn)行java Prompt,系統(tǒng)就會(huì)提示你輸入一行字符。輸入回車后則可以回顯到控制臺(tái)。

使用JNI集成java與native程序


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 四虎影院在线看 | 男人影院在线观看 | 国产精品日本一区二区在线看 | 天天爽天天操 | 国产一久久香蕉国产线看观看 | 日本欧美高清 | 亚洲伦理中文字幕一区 | 啪啪网站免费 | 免费观看国产一区二区三区 | 九九影院理论片在线观看 | 日韩成人免费aa在线看 | 免费一级特黄 欧美大片 | 欧美亚洲另类色国产综合 | 日日免费视频 | 国产成人在线免费观看 | 欧美日本一二三区 | 日本高清视频不卡 | 曰批免费视频播放在线看片二 | 91精品国产人成网站 | 四虎永久免费地址 | 久久精品免费观看久久 | 日韩欧美黄色 | 精品久久亚洲一级α | 午夜精品久久久久久 | 久久香蕉国产线看观看式 | 99香蕉国产 | 欧美一级www片免费观看 | 六月丁香色婷婷 | 全部免费的毛片在线看美国 | 99精品久久99久久久久 | 久久在线观看免费视频 | 蕾丝视频永久在线入口香蕉 | 四虎影视黄色 | 一级大片视频 | 欧洲美女啪啪 | 深夜福利影院 | 久久中文在线 | 久久线看观看精品香蕉国产 | 五月婷婷激情网 | 久久99精品九九九久久婷婷 | 欧美国产亚洲精品高清不卡 |