- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C 例程,它通过 JNI 调用接口(interface)调用 Java 模块。我一直遇到一个问题,即在使用 C 模块和 JNI 时调用 Java 方法一直返回 NULL 字符串,但是当我在命令行中使用 Java 时,Java 模块返回一个错误和一个默认值。
下面是我绕过C代码,在命令行通过Java调用Method返回的数据
$ java ClassName "This" "is" "my" "test" "string"
Exception on SomethingElse.Method: [Function: DifferentMethod]ExceptionClassException: ExceptionClassExceptionException: [Function: CFBDynamicMessage::getCodePage]codePageBytes is NULL, for UTF-8Returned String -- data I'm trying to get
0.0| |0.0| |0.0|| |0.0|0| |0.0| | ||0.0|0|0|0|0|0|0|0|0|0|0||
我需要获取返回的字符串,即使是在 java 端出错的情况下。为了尝试查看 C 和 JNI 中发生了什么,我调高了 JNI 的调试级别:
options[1].optionString = "-Xdebug"; /* print JNI-related messages */
options[2].optionString = "-Xlog:all";
// this next line allows us to continue processing after the Java
// error. Unfortunately the code then SegFaults further on.
options[3].optionString = "-Xcheck:jni:nonfatal";
options[4].optionString = "-verbose:jni";
JNI 启动 JVM,找到类和方法并构建我需要传递给方法的 Java 字符串,但是当我尝试执行该方法时,出现以下错误:
JVMJNCK048E JNI error in CallObjectMethod/CallObjectMethodV: Ineligible receiver JVMJNCK080E Error detected in the outermost frame of an attached thread JVMJNCK023E JNI error detected. Continuing... Segmentation fault (core dumped)
这是 C 代码(为简洁起见,我删除了一些错误检查和空格):
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
cls = (*env)->FindClass(env, "GenericClassName");
mid = (*env)->GetMethodID(env, cls, "execute", "(Ljava/lang/Object;)Ljava/lang/Object;");
jstr = (*env)->NewStringUTF( env, "This|is|my|test|string|");
// This next line is the one that throws the ineligible receiver error
jstring resultStr = (*env)->CallObjectMethod(env, cls, mid, jstr);
// ExceptionOccurred(env) is false; no errors are displayed
if ((*env)->ExceptionOccurred(env)) {
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
}
const char *nativeString = (*env)->GetStringUTFChars(env, resultStr, JNI_FALSE);
// This next line calls the SegFault
fprintf(stdout, "%s\n", *nativeString);
我已经使用 gdb 查看由 SegFault 创建的核心转储,以下是我认为相关的结果:
print nativeString
$1 = 0x8dfaa80 "[Ljava.lang.Class;@34ca34ca"
print *nativeString
$2 = 91 '['
这里是我正在调用的 java 方法的定义:
public Object execute (Object args) throws Exception { ... }
如果您能就此问题提供任何帮助或见解,我们将不胜感激。当我尝试用谷歌搜索不合格的接收者错误时,我得到了一堆关于足球的链接,但一般在 JNI 或 Java 中没有任何链接。我过去几天一直在搜索 Stack Overflow 网站,尽管提出了一些有希望的问题,但它们都与 Android 相关,并且没有提供任何额外的帮助来解决我的问题。
作为最后两个说明,即使您帮不上忙,也感谢您阅读到这里,我的环境是 64 位 RHEL 服务器,但 C 代码和 JVM 都作为 32 位应用程序运行。
TL;DR - C 正在通过 JNI 调用 Java 方法,我收到一个错误代码(CallObjectMethod/CallObjectMethodV 中的 JNI 错误:不合格的接收者)导致 Google 告诉我所有我无法观看的体育赛事因为我正在处理这个问题。
最佳答案
您提供的是类而不是对象。所以你想调用 Class<GenericClassName>.execute(Object arg).
您需要该类的一个实例。
关于java - CallObjectMethod/CallObjectMethodV : Ineligible receiver 中的 JNI 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29308068/
正在开发的应用程序是在 iOS 和 Android 上开发的。 iOS版先创建Facebook app id,只要求email, fb user id, full name,不需要审核。 然后出现了
这是在自定义 PHP 电子商务应用程序中。我可以毫无问题地接收和验证 PayPal IPN 响应,但它永远不会返回卖家保护资格。 这是生成的 IPN 提交表单: 此问题的数据已被替换为虚拟数据,但它是
我有一个 JS 文件: // @flow import type SomeType from './types'; export class MyClass extends React.Compone
昨天我将我的 iPad 更新到 iOS 8.2,现在当我尝试运行我的 Xcode 项目时,我的 iPad 列在“不合格设备”下的括号中,它被写为(OS 版本)。为什么会这样列出?我的应用无法在 iOS
我有一个 C 例程,它通过 JNI 调用接口(interface)调用 Java 模块。我一直遇到一个问题,即在使用 C 模块和 JNI 时调用 Java 方法一直返回 NULL 字符串,但是当我在命
自从去年夏天推出第一个 6.x beta 以来,我就没有使用过 XCode。今天,我在我的 iPhone 6 上安装了最新的 iOS beta,并从开发者门户安装了最新的 XCode beta。我用
我是一名优秀的程序员,十分优秀!