Java Android ndk致命信号代码=1

Java Android ndk致命信号代码=1,java,android,c++,android-ndk,Java,Android,C++,Android Ndk,我尝试调用C++中的java方法。 C++ 应用程序将以 03-12 23:33:29.172:A/libc(21987):0x323030b9(code=1)处的致命信号11(SIGSEGV) 我认为我在C++中有错误。谢谢看起来您正在将一个char*传递给CallVoidMethod()-这是错误的,您需要传递一个jstring对象。要围绕char*生成jstring,请使用env->NewStringUTF() 换句话说,这条线是这样的: env->CallVoidMethod(jo

我尝试调用C++中的java方法。 C++

应用程序将以
03-12 23:33:29.172:A/libc(21987):0x323030b9(code=1)处的致命信号11(SIGSEGV)


我认为我在C++中有错误。谢谢

看起来您正在将一个
char*
传递给
CallVoidMethod()
-这是错误的,您需要传递一个
jstring
对象。要围绕char*生成jstring,请使用
env->NewStringUTF()

换句话说,这条线是这样的:

env->CallVoidMethod(job,meth,env->NewStringUTF(fn.first.data()));

假设字符串确实在UTF-8中。如果它位于另一个代码页(例如CP1251)中,并且可能包含非ASCII字符,则需要进行转换。

看起来您正在将
char*
传递给
CallVoidMethod()
-这是错误的,您需要传递
jstring
对象。要围绕char*生成jstring,请使用
env->NewStringUTF()

换句话说,这条线是这样的:

env->CallVoidMethod(job,meth,env->NewStringUTF(fn.first.data()));

假设字符串确实在UTF-8中。如果它位于另一个代码页(例如CP1251)中,并且可能包含非ASCII字符,则需要进行转换。

看起来您正在将
char*
传递给
CallVoidMethod()
-这是错误的,您需要传递
jstring
对象。要围绕char*生成jstring,请使用
env->NewStringUTF()

换句话说,这条线是这样的:

env->CallVoidMethod(job,meth,env->NewStringUTF(fn.first.data()));

假设字符串确实在UTF-8中。如果它位于另一个代码页(例如CP1251)中,并且可能包含非ASCII字符,则需要进行转换。

看起来您正在将
char*
传递给
CallVoidMethod()
-这是错误的,您需要传递
jstring
对象。要围绕char*生成jstring,请使用
env->NewStringUTF()

换句话说,这条线是这样的:

env->CallVoidMethod(job,meth,env->NewStringUTF(fn.first.data()));

假设字符串确实在UTF-8中。如果它位于另一个代码页(例如CP1251)中,并且可能包含非ASCII字符,则需要进行转换。

您的代码中没有验证。我希望这是为这篇文章剪下来的。您应该检查
clazz
method
是否有效


无论如何,如果我没有遗漏什么,那么您将向Java方法传递一个
char*
,而不是jstring。您必须首先使用JNI
NewStringUTF()
或类似工具将
fn.first
转换为Java字符串。

您的代码中没有验证。我希望这是为这篇文章剪下来的。您应该检查
clazz
method
是否有效


无论如何,如果我没有遗漏什么,那么您将向Java方法传递一个
char*
,而不是jstring。您必须首先使用JNI
NewStringUTF()
或类似工具将
fn.first
转换为Java字符串。

您的代码中没有验证。我希望这是为这篇文章剪下来的。您应该检查
clazz
method
是否有效


无论如何,如果我没有遗漏什么,那么您将向Java方法传递一个
char*
,而不是jstring。您必须首先使用JNI
NewStringUTF()
或类似工具将
fn.first
转换为Java字符串。

您的代码中没有验证。我希望这是为这篇文章剪下来的。您应该检查
clazz
method
是否有效



无论如何,如果我没有遗漏什么,那么您将向Java方法传递一个
char*
,而不是jstring。您必须首先使用JNI
NewStringUTF()
或类似工具将
fn.first
转换为Java字符串。

发布完整堆栈跟踪,或至少更多堆栈跟踪。@ChrisStratton不再感兴趣。只有简单的openCV消息才能找到并禁用阻止您获取堆栈跟踪的任何异常处理程序。或者在ndk gdb下运行。或者在本机代码中添加一些日志记录。但是让人们猜测错误的位置是不合理的。@ChrisStratton我将在完整堆栈跟踪后执行此操作,或者至少执行更多操作。@ChrisStratton不再感兴趣。只有简单的openCV消息才能找到并禁用阻止您获取堆栈跟踪的任何异常处理程序。或者在ndk gdb下运行。或者在本机代码中添加一些日志记录。但是让人们猜测错误的位置是不合理的。@ChrisStratton我将在完整堆栈跟踪后执行此操作,或者至少执行更多操作。@ChrisStratton不再感兴趣。只有简单的openCV消息才能找到并禁用阻止您获取堆栈跟踪的任何异常处理程序。或者在ndk gdb下运行。或者在本机代码中添加一些日志记录。但是让人们猜测错误的位置是不合理的。@ChrisStratton我将在完整堆栈跟踪后执行此操作,或者至少执行更多操作。@ChrisStratton不再感兴趣。只有简单的openCV消息才能找到并禁用阻止您获取堆栈跟踪的任何异常处理程序。或者在ndk gdb下运行。或者在本机代码中添加一些日志记录。但是让人们猜测错误的位置是不合理的。@ChrisStratton我会这么做的谢谢。这有帮助。你太棒了)Op,建议你也看看DeleteLocalRef。在这里泄漏是可以的,但即使如此,允许的本地引用数量也非常少,我认为大约250个,所以最好在调用java方法后删除,最多512个localrefs IIRC。可能取决于Android版本。对于这段代码,这并不重要,但是如果在循环中调用NewStringUTF,删除它们是有意义的。谢谢。这有帮助。你太棒了)Op,建议你也看看DeleteLocalRef。在这里泄漏是可以的,但即使如此,允许的本地引用数量也非常少,我认为大约250个,所以最好在调用java方法后删除,最多512个localrefs IIRC。可能取决于Android版本。对于这段代码,这并不重要,但是如果在循环中调用NewStringUTF,删除它们是有意义的。谢谢。这有帮助。你太棒了)Op,建议你也看看DeleteLocalRef。在这里泄漏可能没问题,但即使如此,允许的本地引用数量也非常少,大约250个,所以最好在ca之后删除