gpt4 book ai didi

java - Android 读取文件和偶尔不正确的值

转载 作者:太空狗 更新时间:2023-10-29 15:12:45 28 4
gpt4 key购买 nike

免责声明

问题已经解决,正如我在评论中描述的那样。我正在考虑删除它,因为没有答案并且我不想混淆其他人,但我的修复不一定针对问题但可以解决它。所以,我会保留它,希望有一天有人会找到答案。

原始问题

我正在使用 android ndk 读取一些文件,但我在输出方面遇到了一些问题。问题是,它大部分时间都在工作,但偶尔会给出错误的输入。下面是我的代码是如何设置的(请注意,这不是完整的代码,但如果需要更多信息,我会添加它。我只是想保持简单)。确切的问题是下面的代码。

  1. 在 NDK C++ 文件中,我使用 fstream 从文件中读取。这些文件存储在手机的内存中,因此可以正常工作。有 2 个文件:

1.1 : 文件1.cpp

JNIExport jdoubleArray class_path_nativeMethod 
(JNIEnv* env, jclass thiz, jint index, jint size){
jdouble dubArray[6];
jdoubleArray result;
result = env->NewDoubleArray(size);

string s = "/sdcard/" + construct_fileName(index);

ifstream is;
if(is.fail()){
return NULL;
}
is.open(s.c_str());

// read something from the files
// save it into dubArray
// assign dubArray to result

return result;
}

1.2 : 文件2.cpp

string construct_fileName(int index){
string s;

switch(index){
case 0:
s = "file1.ext";
break;
case 1:
s = "file2.ext";
break;
case 2:
s = "file3.ext";
break;
default:
// something
}

return s;
}

2 现在是我的主要 Activity ,MainActivity.java

private TextView output;
private TextView output2;
private RadioGroup radioGroup;
private Button calculateButton;

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

this.output = (TextView) findViewById(R.id.textView2);
this.output2 = (TextView) findViewById(R.id.textView3);
this.radioGroup = (RadioGroup) findViewById(R.id.radioGroup1);
this.calculateButton = (Button) findViewById(R.id.button1);
}

public void calculate(View v){
int index;
switch (v.getId()){
case(R.id.button1){
switch(radioGroup.getCheckedRadioButtonId()){
case R.id.radio0:
index = 0;
break;
case R.id.radio1:
index = 1;
break;
case R.id.radio2:
index = 2;
break;
}
}

double arr[] = CppMethods.nativeCalculations(index, 2);
Double i, j;
i = Double.valueOf(arr[0]);
j = Double.valueOf(arr[1]);
this.output.setText(i.toString().subSequence(0, i.toString().length()));
this.output2.setText(j.toString().subSequence(0, j.toString().length()));
}
}

所以问题是,textviews 中的值大部分时间都是正确的。但是,假设我选择了 radio0 按钮,然后按下 button 对象 50 次,我将在 TextView 中得到不正确的输出 5 或 6 次,然后更正其他时间输出。

一些可能有用的信息:

  • 当输出不正确时,我得到一些离谱的数字,例如 2.72364283467E17,而我期望的输出是文件中存储的小于 20 的 double 值。
  • 当输出不正确时,两个 TextView 都有上面显示的荒谬数字
  • 代码肯定是正确的,因为大部分时间输出都是正确的。

很抱歉这个问题很长

谢谢,

NAX

最佳答案

这可能无法解决您的问题,但我注意到以下几点可能会对您有所帮助:

  1. 在您的 file1.cpp 中,遗漏了 env->NewDoubleArray() 的错误处理(或者您是为了发布而故意遗漏的?)

  2. 我不知道您如何将 double 分配给 jdoubleArray,但这里有一些来自 Google(事实上它也适用于其他 JNI 环境):

  3. 线程问题 1:如果你的 native 代码没有为多线程做好准备,我认为最好将 synchronized 添加到 CppMethods.nativeCalculations() (因为 fstream 如果不这样做,则在另一个调用到来时可能仍处于打开状态):

    public class CppMethods {
    public static native synchronized double[] nativeCalculations(int index, int size);
    }
  4. 线程问题 2:您可能需要像 runOnUiThread 这样的东西包装 setText()电话。另外,我想知道你为什么调用setText()如此复杂,我认为这就足够了(顺便说一句, StringCharSequence ):

    final double[] arr = CppMethods.nativeCalculations(index, 2);
    this.runOnUiThread(new Runnable() {
    public void run() {
    this.output.setText(String.valueOf(arr[0]));
    this.output2.setText(String.valueOf(arr[1]));
    }
    });

关于java - Android 读取文件和偶尔不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15318264/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com