调用Android Java JNI GetDoubleField()时发出的SIGABORT
调用GetDoubleField()时,我得到一个SIGABORT 我已经写了一个小样本程序来说明这个问题 MainActivity.java调用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
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);