日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

本地方法(JNI)——数值参数与返回值

發(fā)布時(shí)間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 本地方法(JNI)——数值参数与返回值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【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ù):
package com.corejava.chapter12_2;public class MyPrintf {public static native int print(int width, int precision, double value);}
  • 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ù), 如下所示:

#include "" #include <stdio.h> JNIEXPORT jint JNICALL Java_com_corejava_chapter12_12_MyPrintf_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; }
  • 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。