从C调用带有String参数的Java方法

问题描述

我有一个带有一个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似乎是由调试器引起的。当我不停止在本机方法(使用断点)中执行时,它可以毫无问题地运行。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...