Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用从C获取字符串参数的Java方法_Java_Android_C_Android Ndk_Java Native Interface - Fatal编程技术网

调用从C获取字符串参数的Java方法

调用从C获取字符串参数的Java方法,java,android,c,android-ndk,java-native-interface,Java,Android,C,Android Ndk,Java Native Interface,我让Java方法接受一个Java.lang.String参数。当我从C调用它时,在调用NewStringUTF时总是得到SIGSEGV 如何使用char*string调用Java方法 //Java void doSomething(字符串str){…} /C void Java_some_very_long_函数名(JNIEnv*env,jobject thi) { jclass clas=(*env)->GetObjectClass(env,thi); jmethodID method=(*

我让Java方法接受一个
Java.lang.String
参数。当我从C调用它时,在调用
NewStringUTF
时总是得到SIGSEGV

如何使用
char*
string调用Java方法

//Java
void doSomething(字符串str){…}
/C
void Java_some_very_long_函数名(JNIEnv*env,jobject thi)
{
jclass clas=(*env)->GetObjectClass(env,thi);
jmethodID method=(*env)->GetMethodID(env,clas,“doSomething”,“(Ljava/lang/String;)V”);
jstringstr=(*env)->NewStringUTF(env,strdup(“我的字符串”);//这里有segfults
//TODO调用该方法
}
它发生在执行
NewStringUTF
之后,而不是在
NewStringUTF
调用期间

art::FaultManager::HandleFault(int, siginfo*, void*) 0x00000000eae9efa4
art::art_fault_handler(int, siginfo*, 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
[…]
art::FaultManager::HandleFault(int,siginfo*,void*)0x00000000eae9efa4
艺术:艺术错误处理程序(int,siginfo*,void*)(.llvm.2308358812779254744)0x00000000eae9eccb
___lldb_未命名_symbol25$$app_进程32 0x000000005c58cfe1
___lldb_未命名_symbol2$$libc.so 0x00000000edd18180
艺术::线程::解码作业对象(_作业对象*)常量0x00000000eb244c3f
0x00000000ec29f05d
0x000000005c58b000
Java_very_long_name foo.c:761
[…]

看起来SEGFULT是由调试器引起的。当我没有在本机方法(使用断点)中停止执行时,它会毫无问题地运行。

您能发布SEGFAULT stacktrace吗?这听起来像是C的问题,您应该能够在stacktrace中发现问题,并使用C的常用方法进行调试。@Daniel添加了stacktrace。那么NewStringUTF不是问题吗?它撞坏了哪种石灰?在NewStringUTF调用之后,您有什么代码?上面的示例有点简化。我从Java调用了一个函数,该函数调用了创建字符串的方法。调试器在调用此方法的行中显示它,因此在执行
NewStringUTF
后,它必须是几个指令。Java中的
本机void…
函数声明在哪里?此外,根据您发布的内容,您没有检查任何JNI调用是否存在错误或异常。继续使用无效值或挂起的异常调用JNI函数可能并且通常会导致JVM异常终止。