2014-01-20 169 views
3

我正在研究一個項目(Java),我需要評估可能用C++或Java編寫的用戶代碼。爲了評估代碼,我需要將一個參數傳遞給代碼並從中獲取返回值。我可以輕鬆地爲Java代碼做到這一點;只需爲用戶的類創建一個對象,然後使用該對象調用該函數。我在C++中遇到問題。從Java調用C++函數

我可以從Java調用C++函數並獲取其返回值的可能方法是什麼?我的代碼看起來像這樣(我不能在這裏給出確切的代碼)。
C++代碼

#include<stdio> 
int[] function(int a[]) { } // A Simple function that takes 
          //an array and reverses it and returns it` 

的Java從那裏上述函數被調用

int a[]; //The array I will pass 
int rev[] = Somehow call C++ code from here and pass array a to it. 

我看了網上說JNI可以使用,但它不允許我使用的代碼現有的代碼,它要求將int數組更改爲jint。有什麼辦法可以達到我的目的嗎?我只想將數組傳遞給現有的C++代碼並獲取其返回值。

+0

代碼從'jint'轉變爲'int' – SJuan76

+0

@BobJarvis包裝:這是從Java調用和C++方法而不是相反。我還寫了我在互聯網上找到的一種方式,以及爲什麼我不使用它 – user3215014

+0

@ SJuan76:請您詳細說明一下嗎? – user3215014

回答

1

您需要Java Native InterfaceJNI

http://docs.oracle.com/javase/6/docs/technotes/guides/jni/

+0

感謝您的回答。但正如我所提到的,用戶已經將代碼提交給我。我無法修改該代碼,因爲JNI會要求返回jnitArray的值,而不是簡單地返回用戶可能返回的int數組。有沒有辦法從那裏? – user3215014

+2

然後,你將不得不包裝它,並從中間的東西來調用它。 – Fredrik

+2

@ user3215014您將需要使用JNI爲C++創建一個函數,供Java調用。從這個新函數中,調用你現有的C++代碼,並格式化Java的結果。然後,您將把現有的C++代碼和新的C++ Java函數打包到單個庫中,然後加載和調用Java。 – Samhain

1

利用JNI將完成你的任務:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/

Java代碼:

package test; 

public class PerformWork 
{ 
public PerformWork() 
{ 

} 

public native int[] utilizeArray(int[] arr); 

public int[] performWork(int[] arr) 
{ 
    int[] results = utilizeArray(arr); 
    return results; 
} 
} 

編譯之後,利用javah來創建本地頭文件

javah -classpath <location_of_classes> test.PerformWork

test_PerformWork.h

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

#ifndef _Included_test_PerformWork 
#define _Included_test_PerformWork 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  test_PerformWork 
* Method: utilizeArray 
* Signature: ([I)[I 
*/ 
JNIEXPORT jintArray JNICALL Java_test_PerformWork_utilizeArray 
    (JNIEnv *, jobject, jintArray); 

#ifdef __cplusplus 
} 
#endif 
#endif 

最後,實現本機的功能

#include "test_PerformWork.h" 

JNIEXPORT jintArray JNICALL Java_test_PerformWork_utilizeArray(JNIEnv *env, jobject instance, jintArray arr) 
{ 
jboolean isCopy = FALSE; 
jsize lengthOfArr = env->GetArrayLength(arr); 
jint * arrPtr = env->GetIntArrayElements(arr, &isCopy); 

//call your built in function 
int result[] = {1,2,3,4}; 
const jint * resultPtr = (const jint *)result; 
jintArray javaResult = env->NewIntArray(lengthOfArr); 
env->SetIntArrayRegion(javaResult, 0, lengthOfArr, resultPtr); 

return javaResult; 
}