本文目錄一覽:
怎樣通過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