gpt4 book ai didi

java - 我有一个用 C/C++ 编写的应用程序,每次系统启动/重新启动时都需要运行。实现这一目标的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-02 04:38:23 26 4
gpt4 key购买 nike

所有, 我有一个使用 NDK 编写的简单命令行应用程序。这个应用程序是用 C 编写的。我每次 Android 设备启动时都需要运行它。该设备运行的是 Android 7。

我正在寻找实现这一目标的最简单方法。我必须为此编写一个 Android 应用程序吗?在 Linux 时代,我可以将它添加到 init.rc 或其他一些方法中,或者作为守护进程启动并完成它。

我已经尝试编写一个作为 APK 构建的 Android 服务。这个android服务使用BroadCastReceiver来订阅BOOT_EVENT_COMPLETED。服务的 onCommandStart() 被调用,此时我调用 JNI 方法以使用可执行文件的路径调用 system()。我认为 system() 调用失败,因为该应用程序没有 root 权限。

我知道服务已启动,因为我有 Log.v() 调用,并且可以在 Logcat 中看到。我知道 JNI 方法被调用,因为相同的 JNI 方法返回一个字符串,我将其用作 Android 应用程序窗口的标题,并且该字符串有效。

如果我通过 adb root 和 adb shell/data/来从 adb shell 运行我的应用程序,也可以正常工作

我只需要在系统因任何原因启动或重新启动时运行 native 应用程序。

================================================== ==================================以下是从 adb shell 运行时应用程序上 ls -l 的输出。该应用程序位于/data

-rwxrwxrwx 1根根19512 2019-06-08 14:12

这是 Android 应用程序的代码。顺便说一句,broadcastReceiver 的 OnReceive() 也不会被调用。

这是 MainActivity.java 的代码。这就是 Activity 。我刚刚在这里添加了对 JNI 方法的调用。当标题中使用的 C++ 方法返回字符串时,将调用此函数。这有效。运行应用程序的调用也在最后的 C++ 方法中

package com.rk.startonboot;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.util.*;


public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, MyService.class));

Log.d("RKService", "RKService");

// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}

/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}

This is the code for the service. I was planning to use this to call the C++ method eventually

package com.rk.startonboot;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.*;

public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO write your own code

Log.v("RKServiceLog", "RKServiceLog");

return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
//TODO for communication return IBinder implementation
return null;
}
}

This is the code for the receiver

package com.rk.startonboot;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.*;

public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO write your own code

Log.v("RKServiceLog", "RKServiceLog");

return Service.START_NOT_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
//TODO for communication return IBinder implementation
return null;
}
}

This is the manifest file (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="com.rk.startonboot">

<dist:module dist:instant="true" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService" />

<receiver
android:name="com.rk.startonboot.StartMyServiceAtBootReceiver"
android:exported="true"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
android:label="StartMyServiceAtBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>

</manifest>

这是 C++ 代码。

包括

包括

extern "C"JNIEXPORT jstring JNICALLJava_com_rk_startonboot_MainActivity_stringFromJNI( JNIEnv* 环境, jobobject/* 这个 */) { std::string hello = "来自 LedStrip 的问候"; 系统(“/数据/ledstrip”); 返回 env->NewStringUTF(hello.c_str());}

最佳答案

这可以是非root的!

尝试在 Google Play 商店中使用自动启动功能。 https://play.google.com/store/apps/details?id=com.autostart

这也很容易理解。如果您想了解更多,请访问this页。

关于java - 我有一个用 C/C++ 编写的应用程序,每次系统启动/重新启动时都需要运行。实现这一目标的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56534734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com