java調用函數,java調用函數時實參的冒號

本文目錄一覽:

怎樣通過Java調用自己編寫的R函數?

Java調用R,就是使用JRI.jar中的Api,執行一條R語言命令,當然首先你要了解R語言的語法。\x0d\x0a1.JRI中主要的API\x0d\x0aRengine R引擎,通過它進行R語言的啟動、運算、畫圖、關閉等功能。\x0d\x0a一個線程只能實例化一次,推薦使用單例模式。\x0d\x0a實例化代碼:\x0d\x0aRengine engine = new Rengine(null,false,null);\x0d\x0aRengine.versionCheck() //R版本校驗,返回true:版本校驗通過 返回false:版本校驗未通過\x0d\x0aengine.waitForR() //R載入校驗,返回true:載入成功 返回false:載入失敗\x0d\x0aengine.end() //結束R,在後續沒有調用R的情況下使用,否則R將退出,不能繼續使用R。\x0d\x0a\x0d\x0a2.REXP\x0d\x0aR計算結果表達式\x0d\x0aREXP rexp = engine.eval_r(String str) //執行R命令,返回結果REXP\x0d\x0arexp.asInt() rexp.asDouble() rexp.as.. //將REXP轉成java類型\x0d\x0aengine.assign(String name,double d) //定義R變數,name為R中變數的名字\x0d\x0a\x0d\x0a以上大概了解了JRI的基本API,下面寫個簡單的例子。\x0d\x0a//求n個數的最大值\x0d\x0aRengine engine = new Rengine(null,false,null);\x0d\x0aint[] arr = new int[]{-1,2,1,-3,5,4,-2};\x0d\x0aengine.assign(“x”,arr);\x0d\x0aREXP rexp = engine.eval_r(“max(x)”);\x0d\x0aint max = rexp.asInt();\x0d\x0aSystem.out.println(max);\x0d\x0aengine.end();

JAVA中定義了函數,有返回值,怎麼調用?

你可以這樣理解add(a,b)中向ab傳值,在方法add中處理ab 然後得出一個數,例如sum = a+b;,然後這個方法就返回這個數,當然這個數的類型是你定義的。然後在某個地方你要用到這個sum,你就可以這樣用 Sums = add(a,b);可以這樣用,其實有返回類型的方法你可以認為它就是一個值來用就行了。\x0d\x0a\x0d\x0apublic static void main(String args[]){\x0d\x0a System.out.println(“add(a,b)當a=1,b=2的時候,a+b的值為”+add(1,2));//有返回類型的方法可以直接看成是一個值\x0d\x0a\x0d\x0a}

JAVA如何調用C函數

要在java中調用c語言的庫,需要使用Java提供了JNI。\x0d\x0a舉例說明\x0d\x0a在c語言中定義一個voidsayHello()函數(列印HelloWorld);然後在Java中調用這個函數顯示HelloWord.\x0d\x0a現在分別從Java和C語言兩部分說明:\x0d\x0a1.Java部分\x0d\x0a首先定義一個HelloNative,在其中申明sayHello函數,函數要申明為Native類型的.如下:\x0d\x0apublicclassHelloNative{\x0d\x0apublicnativevoidsayHello();\x0d\x0a}\x0d\x0a\x0d\x0a編譯這個類,生成class文件:\x0d\x0ajavacHelloWorld.java\x0d\x0a\x0d\x0a利用javah生成需要的h文件\x0d\x0ajavahHelloNative\x0d\x0a\x0d\x0a生成的h文件大概如下:\x0d\x0a\x0d\x0a/*DONOTEDITTHISFILE-itismachinegenerated*/\x0d\x0a#include\x0d\x0a/*HeaderforclassHelloNative*/\x0d\x0a\x0d\x0a#ifndef_Included_HelloNative\x0d\x0a#define_Included_HelloNative\x0d\x0a#ifdef__cplusplus\x0d\x0aextern”C”{\x0d\x0a#endif\x0d\x0a/*\x0d\x0a*Class:HelloNative\x0d\x0a*Method:sayHello\x0d\x0a*Signature:()V\x0d\x0a*/\x0d\x0aJNIEXPORTvoidJNICALLJava_HelloNative_sayHello\x0d\x0a(JNIEnv*,jobject);\x0d\x0a\x0d\x0a#ifdef__cplusplus\x0d\x0a}\x0d\x0a#endif\x0d\x0a#endif\x0d\x0a\x0d\x0a可以看一下上面自動生成的程序,程序include了jni.h,這個頭文件在$JAVA_HOME下的include文件夾下.還可以發現生成的函數名是在之前的函數名前面加上了Java_HelloNative。\x0d\x0a2.C語言部分\x0d\x0a根據上面生成的h文件編寫相應的代碼實現,建立一個HelloNative.cpp用來實現顯示HelloWorld的函數.如下:\x0d\x0a\x0d\x0a#include\x0d\x0a#include”HelloNative.h”\x0d\x0a\x0d\x0aJNIEXPORTvoidJNICALLJava_HelloNative_sayHello(JNIEnv*,jobject)\x0d\x0a{\x0d\x0aprintf(“HelloWorld!\n”);\x0d\x0a}\x0d\x0a\x0d\x0a代碼編寫完成之後,我們再用gcc編譯成庫文件,命令如下;\x0d\x0agcc-fPIC-I/usr/lib/jvm/java-7-openjdk-i386/include-I/usr/lib/jvm/java-7-openjdk-i386/include/linux-shared-olibHelloNative.soHelloNative.cpp\x0d\x0a\x0d\x0a這樣就會在當前目錄下生成一個libHelloNative.so的庫文件.這時需要的庫已經生成,在C語言下的工作已經完成了.\x0d\x0a接下來需要在Java中編寫一個程序測試一下.在程序前,需要將我們的庫載入進去.載入的方法是調用Java的System.loadLibrary(“HelloNative”);\x0d\x0a\x0d\x0apublicclassTestNative\x0d\x0a{\x0d\x0astatic{\x0d\x0atry{\x0d\x0aSystem.loadLibrary(“HelloNative”);\x0d\x0a}\x0d\x0acatch(UnsatisfiedLinkErrore){\x0d\x0aSystem.out.println(“Cannotloadhellolibrary:\n”+e.toString());\x0d\x0a}\x0d\x0a}\x0d\x0apublicstaticvoidmain(String[]args){\x0d\x0aHelloNativetest=newHelloNative();\x0d\x0atest.sayHello();\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0a但是再編譯後,運行的時候,問題又出現了.\x0d\x0aCannotloadhellolibrary:\x0d\x0ajava.lang.UnsatisfiedLinkError:noHelloNativeinjava.library.path\x0d\x0aExceptioninthread”main”java.lang.UnsatisfiedLinkError:HelloNative.sayHello()V\x0d\x0aatHelloNative.sayHello(NativeMethod)\x0d\x0aatTestNative.main(TestNative.java:13)\x0d\x0a\x0d\x0a載入庫失敗,但是庫明明就是放在當前文件夾下的,怎麼會載入失敗呢?\x0d\x0a用System.getProperty(“java.library.path”)查看,發現java.library.path中並不u存在當前的目錄.主要有以下的幾個解決辦法:\x0d\x0a1)將生成的庫複製到java.library.path有的路徑中去,當然這樣不是很好\x0d\x0a2)設置環境變數exportLD_LIBRARY_PATH=.:$LD_LIBRARY_PATH,將當前的目錄加入到LD_LIBRARY_PATH中\x0d\x0a3)設置java的選項,將當前的目錄加入到其中.java-Djava.library.path=.$LD_LIBRARY_PATH\x0d\x0a這樣之後程序就能夠成功的運行了.可以看見顯示的”HelloWorld!”了

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/180342.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:13
下一篇 2024-11-22 05:13

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29

發表回復

登錄後才能評論