我使用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 *?以及如何获得返回的字符串?
答案 0 :(得分:1)
您已经研究过如何将jbyteArray
用于unsigned char*
参数。您只需使用login
函数执行的操作,即调用GetArrayLength
和GetByteArrayRegion
。我不需要在这里重复一遍。
对于字符串返回值,您需要使用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());
}