Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.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
JNI调用仅在用作.aar库时才会因NoSuchMethodError而崩溃 我已经制作了一个Android库项目,它将C++本地代码包起来,并将其公开为java API。在本机代码中,我通过标准JNI调用调用了一些自定义Java类方法。以下是一个简化的示例: 爪哇: C++:_Android_Android Ndk_Java Native Interface_Android Library_Aar - Fatal编程技术网

JNI调用仅在用作.aar库时才会因NoSuchMethodError而崩溃 我已经制作了一个Android库项目,它将C++本地代码包起来,并将其公开为java API。在本机代码中,我通过标准JNI调用调用了一些自定义Java类方法。以下是一个简化的示例: 爪哇: C++:

JNI调用仅在用作.aar库时才会因NoSuchMethodError而崩溃 我已经制作了一个Android库项目,它将C++本地代码包起来,并将其公开为java API。在本机代码中,我通过标准JNI调用调用了一些自定义Java类方法。以下是一个简化的示例: 爪哇: C++:,android,android-ndk,java-native-interface,android-library,aar,Android,Android Ndk,Java Native Interface,Android Library,Aar,我通过调用newapiclass().doStuffWithCustomClass(newcustomclass(5)),在项目中使用库 这在插装测试中以及在我将库依赖项添加到同一库项目中的演示应用程序模块中时非常有效。但是,当我在另一个项目中导入my-library.aar时,在本机代码中执行env->CallIntMethod(customObj,midGetMyInt)时,会出现NoSuchMethodError异常 更奇怪的是,如果我在这个新项目中调用本机方法之前从Java调用Custo

我通过调用
newapiclass().doStuffWithCustomClass(newcustomclass(5)),在项目中使用库

这在插装测试中以及在我将库依赖项添加到同一库项目中的演示应用程序模块中时非常有效。但是,当我在另一个项目中导入my-library.aar时,在本机代码中执行
env->CallIntMethod(customObj,midGetMyInt)
时,会出现
NoSuchMethodError
异常

更奇怪的是,如果我在这个新项目中调用本机方法之前从Java调用
CustomClass.getMyInt()
,那么不会出现崩溃:

final CustomClass customClass = new CustomClass(5);
customClass.getMyInt(); // This call makes things not crash???
new ApiClass().doStuffWithCustomClass(customClass);

当然,我不想在使用库API之前调用Java中的每个类方法。那么,有人能解释这里发生了什么吗?

不确定,但似乎与@pskink有关:怎么回事?OP在本机代码中似乎没有使用任何缓存的本地引用。@Michael,这就是我说“不确定”的原因,请注意,如果OP在本地变量
final CustomClass CustomClass=new CustomClass(5)中有一个引用
它可以工作,但是当将
新CustomClass(5)
直接传递给本机方法时,该对象没有附加到任何引用…@pskink我认为它与保持引用无关,因为不管引用如何,它都会崩溃。防止它崩溃的方法是在本机代码中调用方法之前先在Java中调用该方法。像JNI一样,我找不到任何库类方法,除非先在Java中调用它们。如果我试图从本机代码调用类构造函数,它也会崩溃,但是如果我以前在Java中构造了同一类的某个虚拟对象,那么我也可以在本机代码中为该类创建一个新对象。只有当我将其用作.aar文件时,才会发生这种情况,原始库项目工作得很好。嗯,奇怪,所以如果使用“普通”JAR,它工作得很好?真的很奇怪…不确定,但似乎与@pskink有关:怎么回事?OP在本机代码中似乎没有使用任何缓存的本地引用。@Michael,这就是我说“不确定”的原因,请注意,如果OP在本地变量
final CustomClass CustomClass=new CustomClass(5)中有一个引用
它可以工作,但是当将
新CustomClass(5)
直接传递给本机方法时,该对象没有附加到任何引用…@pskink我认为它与保持引用无关,因为不管引用如何,它都会崩溃。防止它崩溃的方法是在本机代码中调用方法之前先在Java中调用该方法。像JNI一样,我找不到任何库类方法,除非先在Java中调用它们。如果我试图从本机代码调用类构造函数,它也会崩溃,但是如果我以前在Java中构造了同一类的某个虚拟对象,那么我也可以在本机代码中为该类创建一个新对象。只有当我将其用作.aar文件时,才会发生这种情况,原始库项目工作得很好。嗯,奇怪,所以如果使用“普通”JAR,它工作得很好?真奇怪。。。
void jniDoStuffWithCustomClass(JNIEnv* env, jobject obj, jobject customObj)
{
    jclass classref = env->GetObjectClass(customObj);
    jmethodID midGetMyInt = env->GetMethodID(classref, "getMyInt", "()I");
    jint val = env->CallIntMethod(customObj, midGetMyInt);
    // Do something with int...
}
final CustomClass customClass = new CustomClass(5);
customClass.getMyInt(); // This call makes things not crash???
new ApiClass().doStuffWithCustomClass(customClass);