我正在创建一个使用JNI加密和解密数据的本机代码。我使用Java代码实际加密和解密,所以我从cpp文件调用这些函数。 主要活动称此加密函数将数据作为字节数组传递,并返回加密字节数组。
当我在设备上运行Android应用程序时,它只是稍微使用背光并退出。我尝试评论代码行, CallObjectMethod()导致了这种行为。
这是我正在使用的cpp代码。
JNIEXPORT jbyteArray JNICALL
Java_com_airtel_agilelabs_utils_NativeEncryptionUtils_encrypt(
JNIEnv* env,
jobject obj, jobject context, jbyteArray data) {
jbyteArray a = data;
jstring key = env->NewStringUTF("[key]");
jclass des = env->FindClass("com/test/test1/utils/NativeDES");
jmethodID encrypt_func = env->GetMethodID(des,"encryptdata","([BLjava/lang/String;)[B");
jobject result = env->CallObjectMethod(obj,encrypt_func,a,key);
jbyteArray byte_result = (jbyteArray) result;
return byte_result;
要为此调用的java类是
public byte[] encryptdata(byte[] data1, String key)
{
byte[] clear = null;
try {
SecretKeySpec sc = new SecretKeySpec(key.getBytes("UTF-8"),"DESede");
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE,sc);
clear = cipher.doFinal(data1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return clear;
}
此外,我不确定是否必须使用CallObjectMethod或任何其他功能。 java函数返回一个字节数组,所以我对该对象进行了类型转换。但由于错误是在上一步产生的,所以不确定这是否正常。