Todos os exemplos que encontrei de chamada de um método Java de C usando a API Foreign Function & Memory envolvem retornos de chamada, ou seja, um método Java que executa alguma função nativa com um retorno de chamada Java como parâmetro.
E quanto a C chamando um método Java diretamente? JNI ainda é a única maneira de fazer isso?
Sim, até onde eu sei, o JNI ainda é a única opção para chamar um método Java a partir de C. Não há alternativas atualmente no Projeto Panamá para chamar Java a partir de C nativo.
Se você está procurando o equivalente de funções nativas como GetMethodId , GetStaticMethodId , CallMethod e CallStaticMethod da Java Native Interface (JNI) , então você está sem sorte. A Foreign Function & Memory (FFM) API não fornece um equivalente para essas funções nativas. Tenha em mente que JNI é uma biblioteca nativa que você inclui em sua própria biblioteca nativa, o que significa que há uma API nativa para interagir com a máquina virtual Java. Enquanto FFM é uma API inteiramente Java. Não só não há equivalente para
CallMethod
e tal, como não há equivalente para nenhuma API nativa definida pela JNI.O código nativo escrito com JNI é inerentemente ciente de que está sendo executado no contexto de uma JVM. Mas a API FFM é projetada para funcionar com código nativo arbitrário, pelo menos enquanto a interface estiver em conformidade com a ABI de C. Apenas o código Java está ciente de que está usando a API FFM. O código nativo não tem ideia de que é parte de um aplicativo Java, muito menos que a API FFM está sendo usada. Ele não tem como interagir diretamente com a JVM.
Dito isso, a API FFM fornece uma maneira de passar ponteiros de função para código nativo com stubs upcall para chamar métodos Java do nativo. No entanto, isso não é equivalente a JNI:
Você tem que criar o stub upcall em Java e então passá-lo para o código nativo por meio de um downcall handle . Não há como criar o stub upcall no lado nativo.
Você está limitado a um método Java por stub de upcall. E se for um método de instância, você está limitado a chamar esse método em uma única instância específica por stub de upcall.
Em contraste, as funções JNI funcionam quase da mesma forma que a reflexão, permitindo que você chame qualquer método de uma classe ou objeto. Você, é claro, precisa de uma referência para
jclass
orjobject
, mas não precisa necessariamente obtê-las do lado Java. É possível obter a classe desejada ou criar o objeto usando a API nativa do JNI.Os dois primeiros pontos significam que os stubs de upcall funcionam inerentemente como callbacks, e é por isso que os exemplos de uso de stubs de upcall os demonstram como tal.