Все, у меня есть простое приложение командной строки, которое я написал с использованием NDK.Это приложение написано на C. Мне нужно запускать его каждый раз, когда загружается мое устройство Android.Устройство работает под управлением Android 7.
Я ищу самый простой способ добиться этого.Должен ли я написать приложение для Android для этого?В дни Linux я мог просто добавить его в init.rc или каким-либо другим методом или начать как демон и покончить с этим.
Я уже пытался написать службу Android, которую я строю как APK.Этот сервис для Android использует BroadCastReceiver для подписки на BOOT_EVENT_COMPLETED.Служба onCommandStart () вызывается, и в этот момент я вызываю метод JNI для вызова system () с путем к моему исполняемому файлу.Я думаю, что вызов system () не удался, потому что у приложения нет корневых разрешений.
Я знаю, что служба запускается, потому что у меня есть вызовы Log.v (), и я вижу это в Logcat.Я знаю, что метод JNI вызывается, потому что тот же метод JNI возвращает строку, которую я использую в качестве заголовка окна приложения Android, и это работает.
Если я запускаю свое приложение из оболочки adb, выполняя adb root, а затемadb shell / data / тоже работает
Мне просто нужно запускать собственное приложение всякий раз, когда система загружается или перезагружается по любой причине.
=============================================================================== Вот вывод команды ls -l в приложении при запуске из оболочки adb.Приложение находится в / data
-rwxrwxrwx 1 root root 19512 2019-06-08 14: 12
Вот код для приложения Android.Кстати, OnReceive () вещательного приемника также не вызывается.
Это код для MainActivity.java.Это деятельность.Я просто добавил вызов метода 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 ++.
include
include
extern "C" JNIEXPORT jstring JNICALL Java_com_rk_startonboot_MainActivity_stringFromJNI (JNIEnv * env, jobject / * this * /) {std :: string hello = "Привет из LedStrip";Система ( "/ данные / ledstrip");return env-> NewStringUTF (hello.c_str ());}