, известно, что функция JNI обычно называют следующим образом (из документации Oracle):вызова JNI функции из-за пределов соответствующего класса Java
Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components:
- the prefix Java_
- a mangled fully-qualified class name
- an underscore (“_”) separator
- a mangled method name
Так имя метода всегда должен содержать соответствующий Java имя класса и не могут быть вызваны извне этого класса. В случае u're называют этот метод из другого класса Android студии инспектор дает предупреждение, как это:
Reports native method declarations in Java where no corresponding JNI function is found in the project.
А если и работать, что и получит java.lang.UnsatisfiedLinkError: Native метод не нашел исключение.
И, таким образом, мой вопрос: как создать общую библиотеку с собственными функциями, которую можно было бы назвать от любым Java-классом?
Чтобы быть более конкретным. У меня есть Java-класс MyActivity. И мне нужно вызвать некоторую функцию jni из этого класса. Как я понимаю, согласно документу Oracle, эту функцию следует называть smth, как Java_xxx_yyy_zz_MyActivity_func1. Тогда представьте, что я также хочу назвать эту функцию из другого приложения для Android. Я скопирую папку lib * .so в папку libs, но я не смогу вызвать функцию func1, а родная функция coz не будет найдена. Для возможности использования этой функции в новом приложении мне нужно создать иерархию папок, которая представляет собой xxx/yyy/zzz и класс MyActivity, и после этого я смогу вызвать func1, но только из этого класса MyActivity. Но что мне делать, если я хочу называть это другим классом?
«Нельзя назвать из-за пределов класса »- это BS, и поэтому поэтому вы сделаете выводы из этого. Сообщение об ошибке, которое вы указываете, относится к случаю * получения неправильного имени JNI *, что является совершенно другой вещью от вызова из-за пределов класса. Неясно, что вы спрашиваете. – EJP
@EJP i обновленный вопрос – borune