首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

JNI范例3-扫描SD卡中mp3文件,native层调用Java自定义的类

2013-02-24 
JNI实例3---扫描SD卡中mp3文件,native层调用Java自定义的类现将native函数贴出来。例如,在本例中,需要调用

JNI实例3---扫描SD卡中mp3文件,native层调用Java自定义的类

现将native函数贴出来。

        

例如,在本例中,需要调用 public native Track_Info[] getTracksArray(String dirPath);在JNI_OnLoad函数中可以看到
其signature就是 (Ljava/lang/String;)[Lcom/coder80/scaner/Track_Info;

Ljava/lang/String;表示参数类型

[Lcom/coder80/scaner/Track_Info;表示函数getTracksArray的返回值为对象数组。
另外千万别忘记L fully-qualified-class ; 这个格式后面的那个;号。
主要类代码如下:

package com.coder80.scaner;import java.io.File;import java.util.ArrayList;import java.util.List;import android.os.AsyncTask;import android.os.Bundle;import android.os.Environment;import android.app.Activity;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;import android.widget.Toast;public class MainActivity extends Activity {private Button mbtn;private Button mbtnJava;private long mTime;private TextView mTextView;private File mSdcardFile;private String mFlagJava = "java";private String mFlagC = "native";private boolean mIsClick;  //防止多次点击private Track_Info mTrack;private List<Track_Info> mTrackList = new ArrayList<Track_Info>();private Track_Info[] mTracks;// = new Track_Info[100];//char[] a = new char[100];private boolean mIsExit;//sdcard是否存在private void log_msg(String msg) {if(true){Log.e(getClass().getSimpleName(), msg);}}    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                mIsClick = false;        mIsExit = true;        mTrack = new Track_Info();        mSdcardFile = Environment.getExternalStorageDirectory();        Log.e("pyb", " mSdcardFile = " + mSdcardFile.toString());if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())) {mIsExit = true;} else {mIsExit = false;Toast.makeText(MainActivity.this, "SDCard不存在,请安装!",Toast.LENGTH_LONG).show();}        mbtn = (Button) findViewById(R.id.button1);        mbtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (mIsExit) {if (!mIsClick){mIsClick = true;Log.e("pyb", " in the JNI scaner");new MyAsyncTask().execute(mFlagC);} }else {Toast.makeText(MainActivity.this, "SDCard不存在,请安装!",Toast.LENGTH_LONG).show();}}});                mbtnJava = (Button) findViewById(R.id.btn2);        mbtnJava.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubLog.e("pyb", " in the Java scaner");new MyAsyncTask().execute(mFlagJava);}});                mTextView = (TextView) findViewById(R.id.TextView02);    }        public void addList(Track_Info track){    mTrackList.add(track);    }        public class MyAsyncTask extends AsyncTask<String, Long, Object> {@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();}@Overrideprotected void onPostExecute(Object result) {// TODO Auto-generated method stubsuper.onPostExecute(result);if(mTime < 1000){mTextView.setText("花费时间: " + Long.toString(mTime) + " 毫秒");}else{mTime = mTime/1000;mTextView.setText("花费时间: " + Long.toString(mTime) + " 秒");}mIsClick = false;}@Overrideprotected Object doInBackground(String... params) {// TODO Auto-generated method stubString flag = params[0];Log.e("pyb", " doInBackground called...flag = " + flag);long time1 = System.currentTimeMillis();//scanDir(mSdcardFile.toString() + "/音乐");if(flag.equals("java")){getFiles(mSdcardFile);for(int i = 0;i< mTrackList.size();i++){Log.e("pyb", "mTrackList[" +i+"] path = " + mTrackList.get(i).getFilePath());}}else if(flag.equals("native")){//scanDir(mSdcardFile.toString());//    array = getPathArray(mSdcardFile.toString());    mTracks = getTracksArray(mSdcardFile.toString());    Log.e("pyb", "mTracks.length = "+ mTracks.length);    for (int i = 0; i < mTracks.length; i++) {    if (mTracks[i] != null) {    Log.e("pyb", "mTracks[" +i+"] path = " + mTracks[i].getFilePath());    } else {    Log.e("pyb", "mTracks == null");    break;    }    }}long time2 = System.currentTimeMillis();mTime = time2 - time1;Log.e("pyb", "in the doInBackground(),scaner mp3 cost time = " + (time2 - time1) );return null;}    };        @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.activity_main, menu);        return true;    }        static {    Log.e("pyb", " System.loadLibrary() called...");        System.loadLibrary("scan");    }    /** * 获取音乐文件列表 * @param filePath */public void getFiles(File filePath) {File[] files = filePath.listFiles();if (files != null) {for (int i = 0; i < files.length; i++) {if (files[i].isDirectory() && !files[i].isHidden() && files[i].canRead()) {getFiles(files[i]);} else {// Mp3supportString displayName = files[i].getName();if (displayName.endsWith(".mp3") || displayName.endsWith(".MP3")) {//String[] strarray = displayName.split("\\.");//String path = files[i].getParentFile().toString();String fileName = files[i].getName();String[] strarray=fileName.split("\\."); //String displayName = strarray[0];String ext = strarray[1];String filepath = files[i].toString();String parentPath = files[i].getParentFile().toString() + "/";mTrack = new Track_Info();mTrack.setDisplayName(displayName);mTrack.setExt(ext);mTrack.setFilePath(filepath);mTrack.setParentPath(parentPath);mTrackList.add(mTrack);}}}}}    public native void scanDir(String dirPath);    public native String[] getPathArray(String dirPath);      public native Track_Info[] getTracksArray(String dirPath); }

       通过本例,可以了解JNI使用方法,对稍微复杂的JNI编程,例如从native层调用Java层对象的讲解,是有一定的帮助的。

      demo代码已经上传到博客资源中!



热点排行