2014-06-30 35 views
0

我已經使用visual studio C++編寫了我的程序,現在我正在嘗試從該代碼創建一個dll以在另一個Java應用程序中使用。例如,我有在C++中的雙功能:在JNI和C++之間發送參數的最佳方式

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

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

然後我隨後一些網頁的關於如何從C++代碼創建一個DLL使用JNI java的指令,所以我包括「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); 

} 

但我應該怎麼做stringunsigned char*在第二個函數?我應該怎麼稱呼那個功能?我應該如何發送一個無符號的char *到那個函數?以及如何獲取返回的字符串?

+0

你不是真的在這裏給非常多的信息。很難知道你的問題是什麼。儘管你試圖返回'std :: string'註定會失敗。你的問題到底是什麼? –

+0

@DavidHeffernan嗨大衛,我需要在Java中使用我的C++代碼,所以我必須使用JNI創建一個DLL。我確切的問題是如何爲C++代碼**而不是C **做到這一點。因爲我曾經使用過C++函數,如'string'等 – osyan

+0

請在問題中提出一個直接而具體的問題,而不是在評論中。不,你將無法像這樣返回'std :: string'。我知道你希望這樣做,但是你的願望並不能實現。它將是DLL邊界上的純C風格的POD類型。 –

回答

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()); 
} 
+0

我得到的**表達式必須在'return(* env) - > NewStringUTF(env,result.c_str())有指針類型**錯誤;' – osyan

+1

對不起,mea cupla。我給你C語法而不是C++。查看最新版本。也在這裏:http://stackoverflow.com/questions/15899813/eclipse-method-newstringutf-could-not-be-resolved –

+0

感謝您的編輯,你救了我的一天。接受和+1 – osyan

相關問題