在JNI和C ++之间发送参数的最佳方式

时间:2014-06-30 10:00:29

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

我使用visual studio c ++编写了我的程序,现在我正在尝试从该代码创建一个dll,以便在另一个java应用程序中使用。例如,我在c ++中有两个函数:

int  __declspec(dllexport) _stdcall   login(const unsigned char pin[4])

string __declspec(dllexport) _stdcall RNG_Gen (unsigned char* data)

然后我按照一些网页的说明如何使用JNI从java的C ++代码创建DLL,所以我包含“jni.h”并编写了另一个这样的函数来调用我的函数:

我使用的第一个功能:

#define JNIEXPORT __declspec(dllexport)
#define JNIIMPORT __declspec(dllimport)
#define JNICALL __stdcall

JNIEXPORT jint JNICALL Java_login
  (JNIEnv *env, jobject obj, jbyteArray pin)
 {
    int len = env->GetArrayLength (pin);
        if(len<PIN_SIZE)return -1;
        unsigned char buf[4];// = new unsigned char[len];
    env->GetByteArrayRegion (pin, 0, len, (jbyte *)(buf));
        return login(buf);

 }

但是我应该在第二个函数中使用 string unsigned char* 做什么?我怎么称呼这个功能?我应该如何向该函数发送unsigned char *?以及如何获得返回的字符串?

1 个答案:

答案 0 :(得分:1)

您已经研究过如何将jbyteArray用于unsigned char*参数。您只需使用login函数执行的操作,即调用GetArrayLengthGetByteArrayRegion。我不需要在这里重复一遍。

对于字符串返回值,您需要使用jstring,如下所示:

JNIEXPORT jstring JNICALL Java_RNG_Gen
    (JNIEnv *env, jobject obj, jbyteArray data) 
{
     // do whatever is needed to obtain the result string
     std::string result = ...; 

     // create a new jstring value, and return it
     return env->NewStringUTF(result.c_str());
}