доступ к нативному методу Android из другого проекта - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над приложением Android, которое будет вызывать файл .so, созданный другим приложением Android NDK.

Я создал следующую структуру папок в своем проекте и скопировал поверх файлов .so, как виднониже:

|--app: 
|--|--src: 
|--|--|--main 
|--|--|--|--jniLibs 
|--|--|--|--|--armeabi 
|--|--|--|--|--|--libmylib.so 
|--|--|--|--|--x86
|--|--|--|--|--|--libmylib.so

Я вызываю эту библиотеку через свое приложение с помощью следующего кода:

static {

        System.loadLibrary("mylib");
    }

Затем я вызываю метод из этого общего объекта с помощью следующего кода:

String str = stringFromJNI();

Это не работает, так как программа ищет искаженное имя функции следующим образом:

com.example.androidlibcall.MainActivity.stringFromJNI (), где моя .so функция будет использовать другое имя пакета иследовательно, генерируется другое имя функции.Я не совсем уверен, что мне нужно делать, чтобы вызывать функции из внешней библиотеки, я предполагаю, что могу создать свою собственную библиотеку и использовать dlopen () для загрузки внешней библиотеки и выполнения вызовов к ней, но мне было интересно, есть лидругие способы добиться этого или нет.

Моя конечная цель - создавать приложения, которые могут вызывать уже существующие библиотеки на мобильном устройстве, но, поскольку я новичок в NDK / Android, я не являюсьуверен, что это лучший метод для этого и не нашел хороших примеров для работы.Похоже, что многие из ранее существовавших аналогичных вопросов касаются более старых версий Android Studio, которые больше не подходят.

Я использую последнюю версию Android Studio (3.1.2) с Gradle 4.4.на компьютере с Windows 7.

Пожалуйста, сообщите.

Спасибо!

1 Ответ

0 голосов
/ 25 апреля 2018

Вообще говоря, не стоит иметь собственные методы в MainActivity приложения, но это не должно волновать нас сейчас, когда мы находим обходной путь.

Предположим, что ваш новый проект имеет com.example.other.MainActivity.java, иВы хотите вызвать нативный метод com.example.androidlibcall.MainActivity.stringFromJNI() из com.example.other.MainActivity.onCreate().Для этого создайте новый класс Java в своем другом приложении:

package com.example.androidlibcall;

public class MainActivity {
    public static native String stringFromJNI();
}

и в своем существующем классе MainActivity

package com.example.other;

import static com.example.androidlibcall.MainActivity.stringFromJNI;

class MainActivity {
    static {
        System.loadLibrary("mylib");
    }
}

public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        …
        String qq = stringFromJNI();
        …
    }
}

Вы видите, что com /Пример / androidlibcall / MainActivity.java не содержит ни логики, ни данных, ни кода.Это всего лишь оболочка, которая позволяет нам легко использовать libmylib.so , не перестраивая его.

...