本地方法(JNI)——数值参数与返回值
【0】README
1) 本文部分文字描述 轉(zhuǎn)自 core java volume 2 , 旨在理解 本地方法(JNI)——數(shù)值參數(shù)與返回值 的基礎(chǔ)知識(shí) ;
2) for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter12/jni_numParamAndReturnValue
【1】本地方法(JNI)——數(shù)值參數(shù)與返回值的實(shí)現(xiàn)步驟
1)problem+solution:
- 1.1)problem: 在一些平臺(tái)上 C 語(yǔ)言中的 int 是 16位的,在另外一些平臺(tái)上是 32 位的;而 java 平臺(tái)上int 類型總是32位的;
- 1.2) solution: java 本地接口定義了 jint, jlong 等類型;
2) 表 12-1 顯示了 java 數(shù)據(jù)類型和 C 數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系:
- 2.1) 在頭文件jni.h 中: 這些類型被 typedef 語(yǔ)句聲明為 在 目標(biāo)平臺(tái)上等價(jià)的類型。 該頭文件還定義了常量 JNI_FALSE=0 , JNI_TRUE=1;
3) 用 printf 函數(shù)格式化數(shù)字
- 3.1)看個(gè)荔枝: 以下代碼使用本地方法來打印給定域?qū)挾群途鹊母↑c(diǎn)數(shù):
3.2)注意: 用C實(shí)現(xiàn)該方法,所有的int 和 double 參數(shù)都要轉(zhuǎn)換為 jint 和 jdouble;
#include "Printf1.h"#include <stdio.h>JNIEXPORT jint JNICALL Java_Printf1_print(JNIEnv* env, jclass cl, jint width, jint precision, jdouble x) { char fmt[30];jint ret;sprintf(fmt, "%%%d.%df", width, precision);ret = printf(fmt, x);fflush(stdout);return ret; }
4) 用 printf 函數(shù)格式化數(shù)字的實(shí)際實(shí)現(xiàn)steps:
- step1) 構(gòu)建java類,用于定義本地方法; 并構(gòu)建測(cè)試類,用于測(cè)試 java 調(diào)用本地方法是否成功;
Attention) 若 static 中的 代碼改為:
static
{
System.load(“XX”);
}
那么 load 里面的文件應(yīng)該使用 絕對(duì)路徑而不是相對(duì)路徑;(不然會(huì)拋出異常, for detailed spec , please visit http://javarevisited.blogspot.jp/2012/03/javalangunsatisfiedlinkerror-no-dll-in.html)
step2)編譯MyPrintf, 并用javah 導(dǎo)出類的頭文件 .h
javac com/corejava/chapter12_2/MyPrintf.java
javah com.corejava.chapter12_2.MyPrintf
step3) copy com_corejava_chapter12_2_MyPrintf.h 里的 print函數(shù)原型到 新建的 MyPrintf.c 文件中, 并實(shí)現(xiàn) print 函數(shù), 如下所示:
step4) 編譯該 c文件,并編譯到動(dòng)態(tài)裝載庫(kù)中:
gcc -c -I /usr/java/jdk1.7/include/ -I /usr/java/jdk1.7/include/linux/ MyPrintf.c
gcc -shared -fPIC -o libMyPrintf.so MyPrintf.o
step5)編譯并運(yùn)行java 文件(MyPrintfTest.java)
step5.1)將該加載庫(kù) 放入到 java.library.path 目錄中:
step5.2) 編譯java文件并運(yùn)行
javac com/corejava/chapter12_2/MyPrintfTest.java
java com.corejava.chapter12_2.MyPrintfTest
總結(jié)
以上是生活随笔為你收集整理的本地方法(JNI)——数值参数与返回值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑主板屏蔽内存(主板禁用内存插槽)
- 下一篇: 本地方法(JNI)——访问域+字符串参数