Android: как потоки Java соответствуют собственным потокам?

В Android, если я вызываю функции из одной и той же библиотеки JNI из разных потоков Java, будут ли функции JNI вызываться в одном и том же собственном потоке или в разных собственных потоках?

Будет ли ответ одинаковым для всех версий Android?

(Я подозреваю, что AsyncTask - не лучший выбор, если вы вызываете библиотеку JNI, которую нужно инициализировать и вызывать в том же собственном потоке.)


person 18446744073709551615    schedule 14.01.2013    source источник
comment
Я мало что знаю о JNI, но мне кажется, что первое, что нужно сделать, это запустить init, а затем вызвать все, что вы хотите, в отдельном потоке   -  person thepoosh    schedule 14.01.2013


Ответы (1)


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

Виртуальная машина Java содержит дополнительную информацию для каждого потока, поэтому потоки, созданные в машинном коде, должны быть сначала подключены к виртуальной машине.

Следующие разделы спецификации JNI дают некоторые подсказки:

Создание ВМ

Функция JNI_CreateJavaVM () загружает и инициализирует виртуальную машину Java и возвращает указатель на указатель интерфейса JNI. Поток, вызвавший JNI_CreateJavaVM (), считается основным потоком.

Присоединение к ВМ

Указатель интерфейса JNI (JNIEnv) действителен только в текущем потоке. Если другому потоку требуется доступ к виртуальной машине Java, он должен сначала вызвать AttachCurrentThread (), чтобы присоединиться к виртуальной машине и получить указатель интерфейса JNI. После подключения к виртуальной машине собственный поток работает так же, как обычный поток Java, выполняемый внутри собственного метода. Собственный поток остается подключенным к виртуальной машине до тех пор, пока он не вызовет DetachCurrentThread () для отключения.

Присоединенный поток должен иметь достаточно места в стеке для выполнения разумного объема работы. Выделение пространства стека для каждого потока зависит от операционной системы. Например, используя pthreads, размер стека можно указать в аргументе pthread_attr_t для pthread_create.

Отключение от ВМ

Собственный поток, подключенный к виртуальной машине, должен вызвать DetachCurrentThread (), чтобы отсоединиться перед выходом. Поток не может отсоединиться, если в стеке вызовов есть методы Java.

person Henry    schedule 14.01.2013
comment
Подскажите пожалуйста ссылку на документы, в которых однозначно говорится именно об этом? (Или это какие-то практические знания?) - person 18446744073709551615; 14.01.2013
comment
@ 18446744073709551615 Я добавил несколько цитат из спецификации JNI (Java 6). - person Henry; 14.01.2013