我怎么弄清楚这个JNI电话有什么问题?

时间:2017-08-21 20:01:12

标签: android java-native-interface

我正在使用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()

补充评论:我知道我没有发送任何参数,但正在解析参数数组。我期待对象的数量为零。

1 个答案:

答案 0 :(得分:2)

在Java代码中,您将androidmain()声明为不接受任何参数,但在C代码中,您将Java_com_TestsRunnerAndroid2015_TestsRunnerAndroid2015_andro‌​idmain(...)声明为将对象数组作为参数。

在Java代码中,当调用androidmain()时,您没有为argsObj提供Java_com_TestsRunnerAndroid2015_TestsRunnerAndroid2015_andro‌​idmain(...)参数

尝试将androidmain声明为public native int androidmain(Object[] argsObj);,并在调用它时传递该参数。