我正在尝试使用JNI将字符串从C发送到Java。 这是我的C代码:
static char* test_encrypt_ecb_verbose(char* plain_text_char, char* key_char, char** ciphertext) { uint8_t i, buf[64], buf2[64]; uint8_t key[16]; // 512bit text uint8_t plain_text[64]; char outstr[64]; memcpy(key,key_char,16) ; memcpy(plain_text, plain_text_char, 64); memset(buf, 0, 64); memset(buf2, 0, 64); // print text to encrypt, key and IV printf("ECB encrypt verbose:nn"); printf("plain text:n"); for(i = (uint8_t) 0; i < (uint8_t) 4; ++i) { phex(plain_text + i * (uint8_t) 16); } printf("n"); printf("key:n"); phex(key); printf("n"); // print the resulting cipher as 4 x 16 byte strings printf("ciphertext:n"); for(i = 0; i < 4; ++i) { AES128_ECB_encrypt(plain_text + (i*16), key, buf+(i*16)); //phex(buf + (i * 16)); for (int j = 0; j < 16; ++j){ printf("%c", (buf + (i * 16))[j]); } printf("n"); } printf("nn decrypted text:n"); for (i = 0; i GetStringUTFChars(env,inputstr,NULL); kstr = (*env)->GetStringUTFChars(env,keystr,NULL); estr = test_encrypt_ecb_verbose(str,kstr,&encstr); printf("---Start---n"); //int b = test(num); for (int j = 0; j NewStringUTF(env,encstr); }
当我在返回java之前打印encstr ..我得到这个:
)Ñi‰ªGÀ6Btílt〜,²#úK23Ej•)Ñi‰ªGÀ6Btílt〜,²#úK23Ej•
但是当我将它发送到Java并打印时,我没有得到相同的字符串。
这是我的Java文件:
public class JniApp { public native String test(String inputstr, String keystr); public static void main(String args[]){ JniApp ja = new JniApp(); String j = ja.test("1234567890abffff0987654321fedcba1234567890abffff0987654321fedcba","fred789lk6n2q7b1"); System.out.println("This is the cipher textn"+j); } static { System.loadLibrary("editjnib"); } }
我怎样才能在Java中获得相同的字符串? 我有什么我做错了吗?
Java String
是逻辑上不可变的Java char
序列,它们是无符号的16位整数,代表UTF-16代码单元。 JNI函数GetStringUTFChars()
逻辑上将这样的序列转码为JVM的内部字符串格式,这是一个以字符结尾的字节序列,包含字符串的Java字符串的“修改过的UTF-8”编码。
通过对GetStringUTFChars()
的两次调用,你所做的事情本身没有任何错误。 事实上,对test_encrypt_ecb_verbose()
的调用也没有任何内在错误,但你必须考虑结果重要性的问题。 如果你想把它当作一系列字符,那么它们的编码是什么? 当然,假设结果是有效的[修改] UTF-8是不合理的。
根据系统的本机区域设置,生成的字节序列可能是也可能不是有效的编码字符串。 特别是,如果默认编码是一个单字节编码,例如ISO-8859-15,那么将它传递给printf()
可能会得到一个合理的乱码结果,但是否则,例如当默认编码是UTF-8时,当您尝试打印时,由终端驱动程序决定如何处理无效字节序列。
类似地,JNI NewStringUTF()
函数要求字节序列包含字符序列的有效修改的UTF-8编码的字节,但同样,您不提供字节序列。 没有理由认为JNI用它做什么将以任何特定的方式与你的终端驱动程序对它做的事情相关联,并且期望能够从生成的Java字符串中恢复编码的字节是不合理的希望,我想你可能想要解密它。
我看到两个主要的选择:
以上就是c/c++开发分享使用JNI将字符串从C发送到Java相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522476.html