Но чтобы его таки пользовать, язык должен в него уметь. Жаба не умеет. Для неё аж целое JNI городить пришлось, чтобы оно хоть как-то перестало быть сферической жабой в вакууме.
Если говорить на чистоту - то из Java тоже можно вызвать нативные методы, не обращаясь к промежуточным библиотекам, например так (это самодостаточный компилируемый код):
Вопрос в том, можно ли написать работающий helloworld без сторонних библиотек на отдельно взятом языке. Если можно - то язык может теоретически быть native. Если нельзя - то опаньки. На жабе нельзя. Жаба не может стать нативным языком.
Чтобы жаба смогла быть нативной - нужно как минимум реализовать в ней способ делать системные вызовы. Однако, концепция жабы как раз подразумевает полный отказ от этого, ради переносимости там и прочих соображений. Поэтому, её место среди питонов, жабоскриптов и всяких прочих.
А вы сможете сделать тоже самое на C, не используя #include и ассемблерные вставки, и не линкуя libc?
Вопрос в том, можно ли написать работающий helloworld без сторонних библиотек на отдельно взятом языке. Если можно - то язык может теоретически быть native. Если нельзя - то опаньки. На жабе нельзя. Жаба не может стать нативным языком.
Что считается сторонними библиотеками? Почему libc можно использовать в коде на C но нельзя в коде на Java?
А вы сможете сделать тоже самое на C, не используя #include и ассемблерные вставки?
#include не нужен, а ассемблерные вставки - часть языка.
В жабе, как языке, принципиально нет никаких конструкций для общения с ядром системы. В разных вариантах жабы (и прочих принципиально ненативных языках) это общение реализуется либо сторонними классами написанными совсем не на жабе, либо жабомашиной, либо каким-нибудь JIT компилятором который тоже не на жабе писан.
Что считается сторонними библиотеками? Почему libc можно использовать в коде на C но нельзя в коде на Java?
libc вовсе не обязателен для написания helloworld.
и получаем в чистом виде совершенно нативное приложение для линукса без всяких библиотек и сторонних сущностей.
То же самое можно сделать и на других языках программирования, но вот жаба к ним не относится вообще ни разу.
А на жабе helloworld без чего-то написанного на нативном для системы языке невозможен. Ну жабу специально так задумали - типа такой сферический язык в вакууме, без возможности общения с системой из кода, а для всякого ввода-вывода и т.п. для каждой системы будут написаны на каких-нибудь сях классы стандартного образца, чтоб связь с внешним миром обеспечить.
Кстати, вопрос: Ну и зачем же жабе нужен какой-то Java Native Access если она сама якобы Native в ведроиде? К какому такому ещё Native этот Access у Java происходит, и почему этот Native окзался внезапно не на Java?
Кстати, вопрос: Ну и зачем же жабе нужен какой-то Java Native Access если она сама якобы Native в ведроиде? К какому такому ещё Native этот Access у Java происходит, и почему этот Native окзался внезапно не на Java?
С нужен ABI вовсе не для вызова функций из libc, он нужен для вызова функций вообще. Так язык устроен. Вызов какой-нибудь open() из libc ничем не отличается от вызова foo() из той же программы.
В жабе же, вызов нативного класса через JNI принципиально отличается от вызова жабного класса. Более того, сам жабокод этого сделать не может, в силу отсутствия в байткоде каких-то специальных команд для этого, нативный код вызывает JVM когда обнаруживает, что жабокод вызвал класс с native.
В исходном коде hello world тоже нет прямых syscall-ов, однако в скомпилированном x86 блобе - они внезапно появляются (если конечно мухлевать и собирать со -static, иначе их там тоже нет)
Во-первых, нет никакой разницы между кодом программы и кодом подгруженной libc. Во-вторых, исходный код helloworld с сисколлами на несколько сообщений выше, а в третьих, в жабобайткоде в принципе не может быть никаких сисколлов.
А без сисколлов программа не может в ввод-вывод и, следовательно, совершенно бесполезна.
Это разделение называется managed code / unmanaged code. И managed code вполне может исполняться как native, одно другому не мешает.
Конечно может. Есть даже сопроцессор для ARM - Jazelle который может выполнять жабобайткод в железе. Но даже он не способен вызвать сисколл. Поэтому должна быть какая-то native прослойка, между жабопрограммой и системой, чтобы программа имела смысл. А сама программа на жабе, вне зависимости от способа выполнения жабобайткода никак не может быть native, потому что будет совершенно бесполезна без настоящей native прослойки между жабой и системой.
Почти все, что называется OS Android, написано на Java. та часть, которая на C/C++ - не так принципиально чтобы это вообще был Linux.
Вот только любое другое ядро будет устроено точно так же, и точно так же у жабы не будет никакой возможности с ядром общаться без native прослойки между жабой и ядром. И как раз вот эта прослойка и будет native, а вовсе не жаба.
Иррациональное желание считать жабу native языком, а приложения на жабе native приложениями есть прямое свидетельство того, что в бронированной жабокриокамере находитесь именно вы.
Вот зачем вам нужно чтобы жабософт внезапно считался native? Что, от этого жаба или написанный на ней софт внезапно как-то изменятся? Ну клепаете жабософт и клепайте дальше, от того, что он в принципе не может быть native ни на одной системе он не станет хуже.
Это что, комплекс жабокодеров, что-ли? Или какое-то профзаболевание? Вы ощущаете себя неполноценным из-за того, что приходится писать на ненативном языке ненативные приложения, что-ли? Тогда зачем вы выбрали язык, который изначально и был задуман именно как ненативный, и именно эта его особенность позиционируется как преимущество жабы?
Лол. С чего вы решили, что я пишу на Java? Ваша интуиция вас постоянно подводит. Более того, я думаю что и родную вашу «сишечку» я знаю получше вас (судя по вашему коду на гитхабе)
Ну если не пишете - то это тогда вообще клиника - всячески мечтать о том, чтобы неблизкий язычок где-нибудь считался native.
Как человек более разбирающися в мобильной разработке, я просто указал вам на то, что весь мир имеет в виду под термином «mobile native app». Вы можете не соглашаться, ваше право.
И как же это можно сишечку «знать получше»? goto и указатели не использовать, что-ли? :)
Ну как минимум не делать ляпов откровенных, в отличии от того, что я видел у вас
Как человек более разбирающися в мобильной разработке, я просто указал вам на то, что весь мир имеет в виду под термином «mobile native app». Вы можете не соглашаться, ваше право.
Хотелось бы увидеть как «весь мир» считает жабопрограммы native app. Я такую чушь слышал только от жабофилов, пока что.
Ну как минимум не делать ляпов откровенных, в отличии от того, что я видел у вас
И что же за ляпы откровенные, интересно? Ткните же пальчиком, может окажется что это вовсе не ляпы, а просто вы чего-то не знаете. :)
И что же за ляпы откровенные, интересно? Ткните же пальчиком, может окажется что это вовсе не ляпы, а просто вы чего-то не знаете. :)
не знаю, что например указатели, возвращаемые из сторонних библиотечных функций, нужно проверять на NULL? (один из косяков ваших, другие - не расскажу, вы своим поведением не заслуживаете того, чтобы вас бесплатно учили)
А нахрена мне это нужно, если альтернативы действий при получении NULL в принципе нету? Нет уж, пусть оно в корку свалится, будет что gdb скормить.
«Безопасный код», не, не слышали..
P.S. Извините, но дальше действительно нет смысла продолжать дискуссию. Такой феерический бред, как несете вы, может нести человек только очень далекий от разработки ПО.
Ох уж эти жабосказочки, ох уж эти жабосказочники. :)
Чтобы получить безопасный код, нужно выловить все возможные ошибки как в самом приложении, так и в низлежащих библиотеках, а не затыкать 100500 дыр всякими сраными «проверками на NULL», которые часто смысла вообще не имеют в силу особенностей работы конкретной ОС.
Проверь malloc на NULL :) Флаг в руки и барабан на шею.