аргументы jstring передаются как ноль в JNI

У меня есть код из двух частей: Java и JNI-cpp. У меня есть два отдельных файла cpp и есть один метод для каждого. Сначала я вызываю Session.cpp, а затем вызываю Camera.cpp.

Два аргумента одинаковы в методах cpp.

Вы можете увидеть часть Java ниже:

// Sign in
String
username = ServiceModel.getInstance().getModelUsername(),
password = ServiceModel.getInstance().getModelPassword(),
licenceKey = ServiceModel.getInstance().getModelLicenceKey(),
serviceIp = ServiceModel.getInstance().getModelCurrentServiceIp(),
hashedPassword = md5(password);
// Get session id
String sessionId
= signIn(username,
hashedPassword,
licenceKey,
serviceIp); // Session Manager
ServiceModel.getInstance().setModelSessionId(sessionId);
// Get camera info
HashMap<String, String> cameraDictionary
= getCameraDictionary(sessionId,
serviceIp); // Camera Manager

Когда я вызываю метод входа в систему, все работает нормально. Метод входа в систему написан так:

extern "C"jstring
Java_com_company_mobile_StreamActivity_signIn(
JNIEnv *env,
jobject,
jstring username,
jstring password,
jstring licenceKey,
jstring serviceIp) {
std::string strServiceIp(env->GetStringUTFChars(serviceIp, NULL));
std::string serviceUrl = "http://" + strServiceIp + "/SessionManager";
SessionManager::IVSOSSessionManagerProxy proxy(serviceUrl.c_str());
std::string strUsername(env->GetStringUTFChars(username, NULL));
std::string strPassword(env->GetStringUTFChars(password, NULL));
std::string strLicenceKey(env->GetStringUTFChars(licenceKey, NULL));
std::string sId;
std::string &sessionId = sId;
if (proxy.signIn(strUsername,
strPassword,
strLicenceKey,
sessionId) == SOAP_OK) {
return env->NewStringUTF(sessionId.c_str());
} else {
return env->NewStringUTF("NO");
}
}

Когда я вызываю метод getCameraDictionary, в первой строке происходит сбой. Вы можете найти код ниже:

extern "C"std::unordered_map<std::string, std::string>
Java_com_company_mobile_StreamActivity_getCameraDictionary(
JNIEnv *env,
jobject,
jstring sessionId,
jstring serviceIp) {
const char* serIp = env->GetStringUTFChars(sessionId, NULL);
std::string serviceUrl = "http://" + std::string(serIp) + "/EncoderManager";
std::string strSessionId(env->GetStringUTFChars(serviceIp, NULL));
CameraManager::ns__IVSOSEncoderContainerSOAPRef cc;
CameraManager::ns__IVSOSEncoderContainerSOAPRef &cameraContainer = cc;
CameraManager::IVSOSEncoderManagerProxy proxy(serviceUrl.c_str());
proxy.getAllCamera(strSessionId, cameraContainer);
std::string cameraName;
std::string cameraUrl;
std::string cameraUri;
std::string cameraUsername;
std::string cameraPassword;
std::string rtspUrl;
std::unordered_map <std::string, std::string> cameraDictionary;
if (cameraContainer.mObject.size() > 0) {
for (int i = 0; i < cameraContainer.mObject.size(); i++) {
cameraName = cameraContainer.mObject[i].mEncoderName;
cameraUrl = cameraContainer.mObject[i].mEncoderIp;
cameraUri = cameraContainer.mObject[i].mEncoderSecondaryRtsp;
cameraUsername = cameraContainer.mObject[i].mEncoderUsername;
cameraPassword = cameraContainer.mObject[i].mEncoderPassword;
if (!(cameraUsername.size() > 0)) {
rtspUrl = "rtsp://"+ cameraUsername
+ ":"+ cameraPassword
+ "@"+ cameraUrl
+ cameraUri;
} else {
rtspUrl = "rtsp://"+ cameraUrl
+ cameraUri;
}
cameraDictionary[cameraName] = rtspUrl;
}
}
return cameraDictionary;
}

Когда я отлаживал, я обнаружил, что причина в том, что sessionId и serviceIp передаются как NULL. В методе возникает проблема GetStringUTFChars(sessionId, NULL), Этот метод не принимает значение NULL в качестве первого параметра. Однако в методе входа в систему все работает нормально. В чем может быть проблема?

Я пробовал много вещей, включая проблемы с управлением памятью или копирование переменных.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …