JNI将无符号字符*转换为jbyteArray,并将jbyteArray返回到java
我使用c获得了一个无符号的char*数据,该数据由AES递减,我想将该数据转换为jbytearyay并返回到java: 代码如下:JNI将无符号字符*转换为jbyteArray,并将jbyteArray返回到java,java,android,c,android-ndk,java-native-interface,Java,Android,C,Android Ndk,Java Native Interface,我使用c获得了一个无符号的char*数据,该数据由AES递减,我想将该数据转换为jbytearyay并返回到java: 代码如下: { unsigned char* token = get_token();//get token from AES decrypt method LOGV("token is:%s",token);//it shows me that string like:"jghgillldjdmdejkgmmjdkf" /** * when i
{
unsigned char* token = get_token();//get token from AES decrypt method
LOGV("token is:%s",token);//it shows me that string like:"jghgillldjdmdejkgmmjdkf"
/**
* when i try this line:unsigned char* token = "jghgillldjdmdejkgmmjdkf";i works.
*/
jclass strClass = (*env)->FindClass(env,"java/lang/String");
jmethodID ctorID = (*env)->GetMethodID(env,strClass,"<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = (*env)->NewByteArray(env,strlen(token));
(*env)->SetByteArrayRegion(env,bytes,0,strlen(token),(jbyte*)token);
return bytes;
}
但是android设备崩溃了,错误日志是:
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0x2c
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] string: 'igkjiekefkdiijikjljmdlf?,x??'
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] in call to NewStringUTF
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] from java.lang.String com.asmine.ssonative.SSONative.getToken(java.lang.String, java.lang.String)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] "Thread-313" prio=5 tid=15 Runnable
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x12ce50a0 self=0xed22a800
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | sysTid=5232 nice=0 cgrp=apps sched=0/0 handle=0xf435ab80
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | state=R schedstat=( 859393537 12390828 74 ) utm=83 stm=2 core=3 HZ=100
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | stack=0xe25fe000-0xe2600000 stackSize=1036KB
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | held mutexes= "mutator lock"(shared held)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #00 pc 00005ac3 /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+83)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #01 pc 00002e91 /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+33)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #02 pc 003c3f0a /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::mirror::ArtMethod*)+138)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #03 pc 0038e85c /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+284)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #04 pc 0010131b /system/lib/libart.so (art::JniAbort(char const*, char const*)+1019)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #05 pc 00101ecc /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+108)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #06 pc 00106b36 /system/lib/libart.so (art::ScopedCheck::Check(bool, char const*, ...) (.constprop.130)+3046)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #07 pc 0010cd4d /system/lib/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+93)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]jni在应用程序中检测到错误:输入无效修改的UTF-8:非法延续字节0x2c
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]string:'igkjeekefkdijikjljmdlf?,x??'
03-23 13:15:01.951:A/art(5211):art/runtime/checkjni.cc:65]调用NewStringUTF
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]来自java.lang.String com.asmine.ssointal.ssointal.getToken(java.lang.String,java.lang.String)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]“Thread-313”prio=5 tid=15 Runnable
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]| group=“main”scont=0 dsCount=0 obj=0x12ce50a0 self=0xed22a800
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]| sysTid=5232 nice=0 cgrp=apps sched=0/0 handle=0xf435ab80
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]| state=R schedstat=(859393537 12390828 74)utm=83 stm=2 core=3 HZ=100
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]| stack=0xe25fe000-0xe2600000 stackSize=1036KB
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]|保持互斥体=“mutator lock”(共享保持)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]本机:#00 pc 00005ac3/system/lib/libbacktrace_libc++.so(UnwindCurrent::Unwind(unsigned int,ucontext*)+83)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]本机:#01 pc 00002e91/system/lib/libbacktrace_libc++.so(Backtrace::Unwind(unsigned int,ucontext*)+33)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]native:#02 pc 003c3f0a/system/lib/libart.so(art::DumpNativeStack(std:u 1::basic_ostream&,int,char const*,art::mirror::ArtMethod*)+138)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]native:#03 pc 0038e85c/system/lib/libart.so(art::Thread::Dump(std:uu 1::basic_ostream&)const+284)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]本机:#04 pc 0010131b/system/lib/libart.so(art::jnibort(char const*,char const*)+1019)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]本机:#05 pc 00101ecc/system/lib/libart.so(art::jnibortf(char const*,char const*,…)+108)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]本机:#06 pc 00106b36/system/lib/libart.so(art::ScopedCheck::check(bool,char const*,…)(.constprop.130)+3046)
03-23 13:15:01.951:A/art(5211):art/runtime/check_jni.cc:65]本机:#07 pc 0010cd4d/system/lib/libart.so(art::CheckJNI::NewStringUTF(_JNIEnv*,char const*)+93)
如果打印strlen(令牌)
会得到什么?什么是“无”-空字节数组还是空字节数组?有没有可能strlen(token)==0?另外,发布所有代码。鉴于您对FindClass()
和GetMethodID()
的调用,您可能遗漏了一些失败的地方。注释:我得到strlen(token)的值总是23,它是从用于AES解密的get_token()方法生成的。我从java得到一个空值。我在上面更新了一些错误日志信息。
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0x2c
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] string: 'igkjiekefkdiijikjljmdlf?,x??'
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] in call to NewStringUTF
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] from java.lang.String com.asmine.ssonative.SSONative.getToken(java.lang.String, java.lang.String)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] "Thread-313" prio=5 tid=15 Runnable
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x12ce50a0 self=0xed22a800
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | sysTid=5232 nice=0 cgrp=apps sched=0/0 handle=0xf435ab80
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | state=R schedstat=( 859393537 12390828 74 ) utm=83 stm=2 core=3 HZ=100
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | stack=0xe25fe000-0xe2600000 stackSize=1036KB
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] | held mutexes= "mutator lock"(shared held)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #00 pc 00005ac3 /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+83)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #01 pc 00002e91 /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+33)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #02 pc 003c3f0a /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::mirror::ArtMethod*)+138)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #03 pc 0038e85c /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+284)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #04 pc 0010131b /system/lib/libart.so (art::JniAbort(char const*, char const*)+1019)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #05 pc 00101ecc /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+108)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #06 pc 00106b36 /system/lib/libart.so (art::ScopedCheck::Check(bool, char const*, ...) (.constprop.130)+3046)
03-23 13:15:01.951: A/art(5211): art/runtime/check_jni.cc:65] native: #07 pc 0010cd4d /system/lib/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+93)