gpt4 book ai didi

android - JNI - 从 jstring 到 byte,从 byte 到 string 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:27:29 25 4
gpt4 key购买 nike

我在 JNI 中转换时遇到问题。

在 C++ 中,我正在使用 AES(Library CryptoPP)创建一些密码。我正在将结果转换为字符串并返回它。获取字符串的代码如下所示:

JNIEXPORT jbyteArray JNICALL Java_com_example_androidake_MutualAuthenticateChip_prepareEncryptionCPP
(JNIEnv *env, jobject thisObj, jboolean hmm, jboolean jinit) {

string encryption= mac->EncryptCertKey();

jbyteArray returns = env->NewByteArray(encryption.size());
env->SetByteArrayRegion(returns, 0, encryption.length(), (jbyte*) encryption.c_str());

return returns;
};

上面的字符串正在转换为返回的 jbyteArray。首先我只想使用

返回字符串
env->NewStringUTF(encryption.c_str()); 

但是应用一直崩溃。我认为这是由变量“加密”的内容引起的。我正在使用 env->NewStringUTF(encryption.c_str());在其他函数中,返回的字符串例如只是一个数字或类似的东西。

然后在 Java 中我进行字节到字符串的转换:

byte[] cipher = mac_A.prepareEncryptionCPP(true, true);
string cipher_str = new String(cipher);

然后我将该字符串再次放入 C++ 对象并将旧密码与从 Java 发送的密码进行比较:

//Java
boolean result = mac_A.compareEncryption(true, cipher);
//JNI
JNIEXPORT jboolean JNICALL Java_com_example_androidake_MutualAuthenticateChip_compareEncryption
(JNIEnv * env, jobject thisObj, jboolean jinit, jstring cipher){
bool init = jinit;
bool result;

jsize length = env->GetStringUTFLength(cipher);
const char *inCStr_ek = env->GetStringUTFChars(cipher, 0);
string s(inCStr_ek, length);

result = mac->CompareCipher(s);

env->ReleaseStringUTFChars(cipher, inCStr_ek);
return result;
};

在 C++ 中比较:

bool MyClass::CompareCipher(std::string cipher_2){
if(cipher == cipher_2){
return true;
}else{
return false;
}
}

它总是返回 false。我不知道我做错了什么。我什至已经将此密码从 Java 发送到 C++,然后将其返回到 Java,字符串是相等的,但在 C++ 端不是。

最佳答案

在你的java端代码上你有

byte[] cipher = mac_A.prepareEncryptionCPP(true, true);
boolean result = mac_A.compareEncryption(true, cipher);

compareEncryption jni 函数是用 jstring 定义的,而不是 jbytearray。

因此,从 JNI 端,您向 java 发送一个字节数组,而从 java 端,您将相同的字节数组发回 native 端(但在调用中使用 jstring),但随后您使用的是 env->GetStringUTFChars (cipher, 0) 将该字节数组转换为修改后的 UTF-8 字符串,因此从技术上讲它不再是同一个字节数组。

如果您需要字符串,请在 java 端进行转换,并在 jni 和 java 之间使用相同的普通字节数组。 See this for string encoding issues在安卓 JNI 中。

关于android - JNI - 从 jstring 到 byte,从 byte 到 string 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26129946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com