从Java调用C ++函数

时间:2014-01-20 12:14:26

标签: java c++ java-native-interface

我正在研究一个项目(在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 ++代码并获得它的返回值。

3 个答案:

答案 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 InterfaceJNI

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

答案 2 :(得分:0)

明确提出问题的人无法重新链接他正在运行的java可执行文件。并且不希望使用用户提交的代码进行审核,因为此代码很容易导致jvm崩溃。

似乎正确的答案是将用户提供的代码编译成.o文件,然后将其与预先编写的&#39; main&#39;调用预定义方法名称的程序,传递任何参数集是测试和评估所必需的。可以从java(web)应用程序中轻松调用此独立本机可执行文件,并将结果返回给用户。