因为是广播自启动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中哪样引入对应的库即可解决问题啦 欢迎大家下方讨论!!!