我正在使用Visual Studio构建一个C ++库,并在我在模拟器中运行的Android Studio项目中使用它。如果我不使用下面的问题代码,项目的其余部分工作正常。
在我的java类中:
public native int androidmain();
public void aFunction() {
androidmain();
}
在我的C ++库中:
#if defined( PLATFORM_ANDROID )
extern "C" {
JNIEXPORT jint JNICALL Java_com_TestsRunnerAndroid2015_TestsRunnerAndroid2015_androidmain( JNIEnv * env, jobject, jobjectArray argsObj ) {
OutputString( "androidmain called" ); // ALMODEBUG
jsize stringCount = 0;
if ( env == nullptr ) {
OutputString( "env is null" );
} else {
OutputString( "env is not null" );
}
if ( argsObj != nullptr ) {
OutputString( "argsObj was not null" );
stringCount = env->GetArrayLength( argsObj ); // CRASH HERE
OutputString( "Got argsObj length." );
} else {
OutputString( "argsObj was null" );
}
...
我得到的输出是:
D/TAG: androidmain called
D/TAG: env is not null
D/TAG: argsObj was not null
W/art: Suspending all threads took: 94.170ms
A/art: art/runtime/java_vm_ext.cc:470] JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0x12c62000
A/art: art/runtime/java_vm_ext.cc:470] from int com.TestsRunnerAndroid2015.TestsRunnerAndroid2015.androidmain()
补充评论:我知道我没有发送任何参数,但正在解析参数数组。我期待对象的数量为零。
答案 0 :(得分:2)
在Java代码中,您将androidmain()
声明为不接受任何参数,但在C代码中,您将Java_com_TestsRunnerAndroid2015_TestsRunnerAndroid2015_androidmain(...)
声明为将对象数组作为参数。
在Java代码中,当调用androidmain()
时,您没有为argsObj
提供Java_com_TestsRunnerAndroid2015_TestsRunnerAndroid2015_androidmain(...)
参数
尝试将androidmain
声明为public native int androidmain(Object[] argsObj);
,并在调用它时传递该参数。