JNI:读取 C 代码中的文本文件并返回到 sdk [英] JNI: Reading a text file in C code and returning to sdk

查看:32
本文介绍了JNI:读取 C 代码中的文本文件并返回到 sdk的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个 android 应用程序以使用 NDK 从文本文件中读取文本.我的 C 代码将字符串读入变量并将字符串变量返回给 java 代码.但是当我运行 Android 应用程序时,字符串显示在TextView 显示为@ 等符号,后跟一些矩形.从 JNI 返回字符串的格式是什么?检查下面的代码.我可以在没有任何其他权限的情况下读取系统文件吗? printf() 语句会做什么?

Im trying to create an android app to read text from a text file using NDK .My C code reads a string into a variable and returns the string variable to java code .But when I run the Android app the string displayed in the TextView appears as symbols like @ followed by some rectangles.What is the format of returning strings from JNI? Check the below code.Can I read a system file without any other permission?What will a printf() statement do?

Java 代码:

package com.example.openfile;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
public native String ndkopenfile();
static{
    System.loadLibrary("mylib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //TextView textView1 = new TextView(this);
    //textView1.setText(ndkopenfile());
    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    String str1;
    Log.d("Click","The button has been clicked to open the file");

    str1=ndkopenfile();

    //setTitle(str1);
    TextView tv = (TextView)findViewById(R.id.textView1);
    tv.setText(str1);
}

}

C 代码:

JNIEXPORT jstring JNICALL Java_com_example_openfile_MainActivity_ndkopenfile
(JNIEnv *env, jobject this)
{

    jstring str1[20];
    FILE* fp = fopen("/sdcard/x.txt","w+");
    if(fp!=NULL)
    {
        fgets(str1,20,fp);
        fflush(fp);
        fclose(fp);
        return(*env)->NewStringUTF(env,str1);
    }
    else
    {
        fclose(fp);
        return(*env)->NewStringUTF(env,"Error opening file!");
    }
 }

推荐答案

试试这个:

JNIEXPORT jstring JNICALL Java_com_example_openfile_MainActivity_ndkopenfile
(JNIEnv *env, jobject this)
{
        char myStr[20];
        FILE* fp = fopen("/sdcard/x.txt","w+");
        if(fp!=NULL)
        {
            fgets(myStr,20,fp);
            fflush(fp);
            fclose(fp);
            return(*env)->NewStringUTF(env,myStr);
        }
        else
        {
            fclose(fp);
            return(*env)->NewStringUTF(env,"Error opening file!");
        }
}

这项技术非常有效!经过测试.

This technique works perfectly !!! Tested.

这篇关于JNI:读取 C 代码中的文本文件并返回到 sdk的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆