加载本机库两次

时间:2013-08-06 13:24:59

标签: android android-ndk native native-code

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

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

  1. 使用自定义类加载器(仍然加载System.gc()库之后)
  2. 在自己的进程中运行服务(它没有用。在杀死服务后仍然加载了库)。
  3. 编写一个通过dlopen加载RTMP库的本机库,并通过dlclose关闭它。
  4. 我不知道任何进一步的选择:/我甚至不知道如何编写本地库来加载其他库:/

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

1 个答案:

答案 0 :(得分: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"
    android:exported="false"
    android:process=":rtmp"
  3. 开始服务:

    Intent rtmpdumpIntent = new Intent(getApplicationContext(), rtmpdumpService.class);
                eSendIntent.putExtra("rtmp", "RTMP CODE");
                startService(rtmpdumpIntent);
    
  4. 有时你必须等到它完成:

    服务启动后(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;
        }