В Android 7 (root) сбой libusb_init с LIBUSB_ERROR_OTHER - PullRequest
1 голос
/ 30 января 2020

Я пытаюсь использовать libusb в приложении Android, оно встроено в собственный модуль Android и создано с помощью cmake. Код вызывает только libusb_init и возвращает строку активности, и она систематически завершается с ошибкой с помощью LIBUSB_ERROR_OTHER.

Дело в том, что я могу заставить ее работать, когда она запускается из небольшой программы командной строки, выполняющей только libusb_init, которую мы запустить с оболочкой adb. В этом случае он возвращает успех.

Устройство (Samsung Galaxy Tab E) работает Android 7 и имеет root-права, с помощью диспетчера Magisk я даю своему приложению разрешение root, но это не то же самое, что делать "su" в командной строке.

Я в основном пробовал с версиями 20 и 22 (в других наших проектах мы используем в основном версию 20).

Я уже пробовал много решений и обходных путей для стекового потока, но они либо были неэффективными или невозможно реализовать (например, из-за ограничений rom).

Вот как я называю libusb. c:

#include <jni.h>
#include <string>

extern "C" {
#include "libusb.h"
}

using namespace std;

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    string hello = "Hello from C++";
    libusb_context **lusb;
    int rc = libusb_init(lusb);

    return env->NewStringUTF(hello.c_str());
}

А вот как я называю этот код из Activity :

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)
        //The purpose of this is to ask for root access, handled with 
        //Magisk Manager in my case
        Runtime.getRuntime().exec("su")

        fab.setOnClickListener { view ->
            Snackbar.make(view, "Result = ${stringFromJNI()}", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()
        }
    }

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

    companion object {

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

Небольшая программа, которую я запускаю из командной строки (работает ли я root или нет):

#include <iostream>
extern "C" {
    #include "libusb.h"
}
using namespace std;

int main (int argc, char* argv[]) {
    libusb_context *lusb;
    int rc = libusb_init(&lusb);
    if ( rc != LIBUSB_SUCCESS ) {
        cout << "Failed to open api. Error: " << libusb_error_name(rc) << endl;
        return 1;
    }

    cout << "This worked" << endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...