Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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 Java JNI GetDoubleField()时发出的SIGABORT_Java_Android_Java Native Interface - Fatal编程技术网

调用Android Java JNI GetDoubleField()时发出的SIGABORT

调用Android Java JNI GetDoubleField()时发出的SIGABORT,java,android,java-native-interface,Java,Android,Java Native Interface,调用GetDoubleField()时,我得到一个SIGABORT 我已经写了一个小样本程序来说明这个问题 MainActivity.java package net.directionalsystems.jnitest; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; pub

调用GetDoubleField()时,我得到一个SIGABORT

我已经写了一个小样本程序来说明这个问题

MainActivity.java

package net.directionalsystems.jnitest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}

private static final String TAG = "Mainactivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Example of a call to a native method
    TextView tv = findViewById(R.id.sample_text);

    JniComms jc = new JniComms();
    jc.latitude = 10;
    jc.logitude = 20;
    jc.txtLocation = "Hello";

    try {
        tv.setText(stringFromJNI(jc));
    }
    catch (Exception e)
    {

        Log.e(TAG, "onCreate: ", e);
    }
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native String stringFromJNI(JniComms jc);
package net.directionalsystems.jnitest;

import java.util.ArrayList;

public class JniComms
{
    public double latitude;
    public double logitude;
    public String txtLocation;
    //public ArrayList<BleStatus> bleStatusArray;

}
}

JniComms.java

package net.directionalsystems.jnitest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}

private static final String TAG = "Mainactivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Example of a call to a native method
    TextView tv = findViewById(R.id.sample_text);

    JniComms jc = new JniComms();
    jc.latitude = 10;
    jc.logitude = 20;
    jc.txtLocation = "Hello";

    try {
        tv.setText(stringFromJNI(jc));
    }
    catch (Exception e)
    {

        Log.e(TAG, "onCreate: ", e);
    }
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 */
public native String stringFromJNI(JniComms jc);
package net.directionalsystems.jnitest;

import java.util.ArrayList;

public class JniComms
{
    public double latitude;
    public double logitude;
    public String txtLocation;
    //public ArrayList<BleStatus> bleStatusArray;

}
这一定是我正在做的简单而愚蠢的事情

我想调试NDK代码,但我得到的只是显示的jni.h文件,无法进入jni代码本身。拥有这种能力可能会让我知道什么是错的

非常感谢你的帮助

致以最诚挚的问候,Jackie

在读取实例(非静态)字段时,您应该传递对象,而不是类

因此,请替换:

jdouble latitude = env->GetDoubleField(jcClass, iId);
与:


在CPP代码中,Env指针和IID的值是什么?难道你不应该使用(*Env)作为(*Env)-> GeFieldEd而不是Env- > GeFieldID等等吗?@ CPLUSOGL>代码> EnV-> < /C> >对于C++代码是正确的。代码>(*Env)-> /Cord>是C.的方式,无论是C还是C++,语法都是正确的。如果你正在把指针去引用或者指针指针引用的指针弄乱,那么就会出现一个很大的问题:“语法都是正确的,无论C++还是C++”。代码> JNENV在C和C++中定义为不同类型。JC或JO对象?<代码> JC< /COD>。
jo
对象是
MainActivity
实例。谢谢Michael,我知道我做了一些愚蠢的事情。用jc替换jcClass确实解决了这个问题。顺致敬意,Jackie@Jackie这就是为什么您需要始终检查JNI中的所有返回值。
jdouble latitude = env->GetDoubleField(jc, iId);