我正在研究一个项目(在Java中),我需要在其中评估可能用C ++或Java编写的用户代码。要评估代码,我需要将参数传递给代码并从中获取返回值。我可以很容易地为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 :(得分:2)
利用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;
}
答案 1 :(得分:1)
您需要Java Native Interface
或JNI
。
答案 2 :(得分:0)
明确提出问题的人无法重新链接他正在运行的java可执行文件。并且不希望使用用户提交的代码进行审核,因为此代码很容易导致jvm崩溃。
似乎正确的答案是将用户提供的代码编译成.o文件,然后将其与预先编写的&#39; main&#39;调用预定义方法名称的程序,传递任何参数集是测试和评估所必需的。可以从java(web)应用程序中轻松调用此独立本机可执行文件,并将结果返回给用户。