Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Android 由';引用的JVM对象;foo#u模型&x27;类型为';类<;Foo>';并且它不能访问字段';浮动a';在'中声明;Foo';_Android_Kotlin_Java Native Interface - Fatal编程技术网

Android 由';引用的JVM对象;foo#u模型&x27;类型为';类<;Foo>';并且它不能访问字段';浮动a';在'中声明;Foo';

Android 由';引用的JVM对象;foo#u模型&x27;类型为';类<;Foo>';并且它不能访问字段';浮动a';在'中声明;Foo';,android,kotlin,java-native-interface,Android,Kotlin,Java Native Interface,为什么我不能访问我的数据类上的公共成员 在我的测试Android Kotlin/NDK应用程序中,GetFloatField正在报告 “foo_model”引用的JVM对象属于“Class”类型,它无权访问“foo”中声明的字段“float a” Class是我用所有公共成员定义的数据类 我是Kotlin的新手,所以这个应用程序只是一个练习,让我学习如何在本机层之间传递自定义结构 MainActivity.kt package com.example.structtest import and

为什么我不能访问我的数据类上的公共成员

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

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

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

我是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")
        }
    }
}
本机lib.cpp

#包括
#包括
外部“C”JNIEXPORT jstring JNICALL
Java\u com\u示例\u structtest\u Main活动\u stringFromJNI(
JNIEnv*env,
jobject/*此*/){
std::string hello=“来自C++的hello”;
return env->NewStringUTF(hello.c_str());
}
外部“C”JNIEXPORT作业对象JNICALL
Java\u com\u示例\u structtest\u Main活动\u doubleFoo(
JNIEnv*env,
jobject/*此*/,
jobject(乌福){
auto-foo\u model=env->GetObjectClass(\u-foo);
auto const foo_float_field=env->GetFieldID(foo_model,“a”,“F”);
auto const foo_int_field=env->GetFieldID(foo_model,“b”,“I”);
//
//这就是我在这些GetFloatField调用中得到错误的地方
//
auto const foo_float=env->GetFloatField(foo_模型,foo_float_字段);
auto const foo_int=env->GetFloatField(foo_模型,foo_int_字段);
//我甚至不确定这些线是否有用。
//我怀疑上面抛出的错误会在执行这些错误之前使应用程序崩溃
自动新建_foo_model=env->FindClass(“com/example/structtest/foo”);
自动构造函数=env->GetMethodID(新的_-foo_模型,”,“(FI)V”);
自动新建\u foo=env->NewObject(新建\u foo\u模型,构造函数);
返回新的_foo;
}

您试图从描述
Foo
对象(代码中的
Foo\u模型
)读取字段
a
,而不是直接从
Foo
实例(代码中的
\u Foo
读取)

更改
env->GetFloatField(foo\u模型,foo\u float\u字段)

env->GetFloatField(\u foo,foo\u float\u field);

您试图从描述
Foo
对象(代码中的
Foo\u模型
)读取字段
a
,而不是直接从
Foo
实例(代码中的
\u Foo
读取)

更改
env->GetFloatField(foo\u模型,foo\u float\u字段)

env->GetFloatField(\u foo,foo\u float\u field);

Foo
是数据类
Class
是描述
Foo
Class
对象的类型。更改
env->GetFloatField(foo\u模型,foo\u float\u字段)
env->GetFloatField(\u foo,foo\u float\u field).Ack,我知道这会是一件愚蠢的事情。学习的痛苦。谢谢为什么不将此作为答案发布,以便我可以批准它?完成后,我开始评论时只是指出
Class
不是
Foo
,直到写了一半才意识到这是手头的实际问题,而不仅仅是无害的术语混淆;-)
Foo
是数据类
Class
是描述
Foo
Class
对象的类型。更改
env->GetFloatField(foo\u模型,foo\u float\u字段)
env->GetFloatField(\u foo,foo\u float\u field).Ack,我知道这会是一件愚蠢的事情。学习的痛苦。谢谢为什么不将此作为答案发布,以便我可以批准它?完成后,我开始评论时只是指出
Class
不是
Foo
,直到写了一半才意识到这是手头的实际问题,而不仅仅是无害的术语混淆;-)