qt android 开机自启动service 想调用qt的函数的方法

因为是广播自启动service,就难免会调用qt的函数,但是因为是自启动service,qt界面没有被启动会导致qt中的函数不可被Java识别,一但调用就会出错,至于为什么,是因为qt android 是将qt打包成so库给Java使用的,如若没启动qt界面,qt打包成的so库就没有加载到Android中,导致service调用qt的函数失败 解决方法就是自己在用到qt函数的类载入qt生成相关的so库就可正常使用了(原理就是因为qt是吧自己打包成so库给Android调用的,就相当于Android studio里的调用so库的方法一样的,但是为什么qt正常启动的Android项目是不需要自己载入so库的呢,是因为qt它会帮你做好这些事,但是你不启动界面,qt应该是不会帮你做这一步的,那你就要自己去做)

广播启动service的代码如下:

public class AutoStartBroadReceiver extends BroadcastReceiver {  
    @Override
    public void onReceive(Context context, Intent intent) {
            /* 服务开机自启动 */
            Intent service = new Intent(context, MyService.class);
            context.startService(service);
            Log.e("E/AAAAAA", "自启动开启服务!");   
        }

}

在AndroidManifest.xml中声明广播并添加对应的权限

<!--定义广播接收者,准备用于开机的过程当中,接收开机启动的广播  -->
        <receiver android:name="org.qtproject.example.AutoStartBroadReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.HOME"/>
            </intent-filter>
        </receiver>
<!--接收启动完成的广播权限-->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

service中调用qt函数和载入库的操作:

static{//加载so库共自启动时使用
        System.loadLibrary("AndroidYH"); //这个就是项目生成的so库 下面会告诉你这些库去那里                           //                                          拿的      
        System.loadLibrary("Qt5Gui");
      //...等等把用到的so库加载进来
        }
public static native void javaCallC();//该方法为Java调用qt的接口

qt中定义该方法:

extern "C"
{
//供java调用的接口函数
JNIEXPORT void JNICALL Java_org_qtproject_example_MyService_javaCallC();
}

其中 加载so库的位置是qt项目编译后的android-build文件的libs目录下有对应的so库 如图:

里面都是qt给Java调用的so库 但并不是所有都是你当前调用的这个函数用到的 添加so库时要添加用的上的 用不上的也添加很容易报错,这些库都会被qt 打包到apk中 引入这些库像上面service中哪样引入对应的库即可解决问题啦 欢迎大家下方讨论!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值