-1

我在 Android 上使用RTMP下载流。如果我第一次运行库,一切正常。第二次应用没有启动 RTMP 下载:/

我搜索了过去三天,知道我不能两次加载本机库或只是卸载它,并且我有三个选项来处理我的问题:

  1. 使用自定义类加载器(在 System.gc() 库仍然加载之后)
  2. 在自己的进程中运行服务(它不起作用。在终止服务后仍然加载库)。
  3. 编写一个本地库,通过 加载 RTMP 库dlopen并通过dlclose.

我不知道任何进一步的选择:/我什至不知道如何编写本机库来加载其他库:/

我使用了这个 RTMP 转储:https ://github.com/eschriek/rtmpdump-android

4

1 回答 1

0

好的,我找到了一种方法:)也许它不是一个漂亮的方法,但它工作正常:

  1. 创建服务:

    import android.app.Service;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.IBinder;
    
    public class rtmpdumpService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
            config = this;
            String extras = "";
            if(intent != null){
    
                //Get needed information
                extras = intent.getExtras().getString("rtmp");
            }
            else {
                this.stopSelf();
            }
            doWork(extras);
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    
        public void doWork(String rtmp){
            //Do work here: for example rtmpdump
            Rtmpdump dump = new Rtmpdump();
            dump.parseString(params[0]);
            System.exit(0);
            this.stopSelf();
        }
    }
    
  2. 在 AndroidManifest 中注册为具有这些属性的服务

    android:name=".rtmpdumpService"
    安卓:导出=“假”
    安卓:进程=“:rtmp”
  3. 启动服务:

    Intent rtmpdumpIntent = new Intent(getApplicationContext(), rtmpdumpService.class);
                eSendIntent.putExtra("rtmp", "RTMP CODE");
                启动服务(rtmpdumpIntent);
    

有时您必须等到它完成:

服务启动后(startService(rtmpdumpIntent):

do {
    try {
        Thread.sleep(500);
    }
    catch (InterruptedException e) {
        //Log
    }
} while( isServiceRunning(rtmpdumpService.class) == true);

isServiceRunning 函数:

    private boolean isServiceRunning(Class cl) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (cl.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
于 2013-08-07T13:45:23.660 回答