问题描述
我有一个带有一个java.lang.String
参数的Java方法。当我从C调用它时,总是在调用NewStringUTF
时得到SIGSEGV。
如何使用char *
字符串调用Java方法?
// Java
void doSomething(String str) { … }
// C
void Java_some_very_long_function_name(JNIEnv *env,jobject thi)
{
jclass clas = (*env)->GetObjectClass(env,thi);
jmethodID method = (*env)->GetMethodID(env,clas,"doSomething","(Ljava/lang/String;)V");
jstring str = (*env)->NewStringUTF(env,strdup("My String")); // Segfaults here
// TODO Call the method
}
发生这种情况是在执行NewStringUTF
之后,而不是在NewStringUTF
调用期间。
art::FaultManager::HandleFault(int,siginfo*,void*) 0x00000000eae9efa4
art::art_fault_handler(int,void*) (.llvm.2308358812779254744) 0x00000000eae9eccb
___lldb_unnamed_symbol25$$app_process32 0x000000005c58cfe1
___lldb_unnamed_symbol2$$libc.so 0x00000000edd18180
art::Thread::DecodeJObject(_jobject*) const 0x00000000eb244c3f
<unknown> 0x00000000ec29f05d
<unknown> 0x000000005c58b000
Java_very_long_name foo.c:761
[…]
解决方法
segfault似乎是由调试器引起的。当我不停止在本机方法(使用断点)中执行时,它可以毫无问题地运行。