“foo_model”引用的 JVM 对象的类型为“Class<Foo>”,并且它无权访问“Foo”中声明的字段“float a”

Mat*_*att 3 java-native-interface android kotlin

为什么我无法访问数据类上的公共成员?

在我的测试 Android Kotlin/NDK 应用程序中,GetFloatField正在报告

“foo_model”引用的 JVM 对象属于“Class”类型,它无权访问“Foo”中声明的字段“float a”。

Class<Foo>是我用所有公共成员定义的数据类。

我是 Kotlin 新手,所以这个应用程序只是我学习如何在本机层之间传递自定义结构的一个练习。

MainActivity.kt

package com.example.structtest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

public data class Foo(var a: Float = 3.14f, var b: Int = 10)

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var f = Foo(3.14f, 10)

        var dFoo = doubleFoo(f)
        sample_text.text = "foo.a = ${dFoo.a}, foo.b=${dFoo.b}"
    }

    external fun doubleFoo(_foo : Foo): Foo

    companion object {
        // Used to load the 'native-lib' library on application startup.
        init {
            System.loadLibrary("native-lib")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

native-lib.cpp

package com.example.structtest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

public data class Foo(var a: Float = 3.14f, var b: Int = 10)

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var f = Foo(3.14f, 10)

        var dFoo = doubleFoo(f)
        sample_text.text = "foo.a = ${dFoo.a}, foo.b=${dFoo.b}"
    }

    external fun doubleFoo(_foo : Foo): Foo

    companion object {
        // Used to load the 'native-lib' library on application startup.
        init {
            System.loadLibrary("native-lib")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 5

您试图a描述的Class对象(在您的代码中)而不是直接从实例(在您的代码中)读取字段。 Foofoo_modelFoo_foo

改成env->GetFloatField(foo_model, foo_float_field);

env->GetFloatField(_foo, foo_float_field);
Run Code Online (Sandbox Code Playgroud)