android-使用NDK从本机代码调用Java函数

android-使用NDK从本机代码调用Java函数,第1张

概述前几天我问了这个问题,但不是太具体,所以我想再次澄清.我正在创建一个使用NDK在C中使用现有库的Android应用程序.我遇到的问题是C代码使用了Java没做的很多事情(将函数指针作为参数是个大问题).无论如何,我想知道是否可以在C代码调用的Java代码中编写函数.现在,从我能说的范围内,

前几天我问了这个问题,但不是太具体,所以我想再次澄清.

我正在创建一个使用NDK在C中使用现有库的Android应用程序.我遇到的问题是C代码使用了Java没做的很多事情(将函数指针作为参数是个大问题).

无论如何,我想知道是否可以在C代码调用的Java代码中编写函数.现在,从我能说的范围内,您可以做到这一点,因此,如果没有人回答“是的,link”,我将不胜感激. .

谁能解释这个过程?我知道这涉及在C代码中创建JVM.任何有助于新手站起来的信息将不胜感激.

谢谢

编辑:

因此,我不知道该怎么做这三个步骤.

To call a specific Java function from C, you need to do the following:Obtain the class reference using the FindClass(,,) method.Obtain the method IDs of the functions of the class that you want to call using the GetStaticmethodID and getmethodID function calls.Call the functions using CallStaticVoIDMethod, CallStaticIntMethod, and CallStaticObjectMethod.

这没有太多解释,我几乎没有C的经验.FindClass是C方法吗?

解决方法:

可以通过JNI从Java调用的每个C函数都有一个jnienv *类型的第一个参数.在C端,这是一个指向具有多个函数指针的结构的指针.这些功能是您与Java世界的接口. FindClass,getmethodID和其余的都在其中.

因此,当您想从C端调用FindClass时,方法如下:

voID Java_com_mypackage_MyClass_MyMethod(jnienv *jnienv, jobject thiz){    jclass *clazz = (*(*jnienv)->FindClass)(jnienv, "com/mypackage/SomeClass");    jmethodID MethodID = (*(*jnienv)->GetStaticmethodID)(jnienv, clazz, "SomeMethod", "(I)I");    int result = (*(*jnienv)->CallStaticIntMethod)(jnienv, clazz, MethodID, 18);

依此类推.该行取消了jnienv参数的引用,获取了一个函数指针,并通过它调用了函数.自然,类和方法名完全是伪造的.我怎么知道你的

注意:我在这里说的是函数指针,但与您的意思不同.这些是指向JNI提供的功能的函数指针,而不是指向您的函数的函数指针.

调用语法的冗长程度与C的局限性有关.在C中,您可以改写

jclass *cl = jnienv->FindClass("com/mypackage/SomeClass");

因为C通过虚拟函数本地支持这种函数表指针.

您可能会沿途采取一些捷径.如果要在与C入口点相同的类中调用方法,并且它恰好是静态的,则第二个参数已经是类对象指针.如果您具有要在其上调用方法的对象的this指针,则可以使用GetobjectClass.

总结

以上是内存溢出为你收集整理的android-使用NDK从本机代码调用Java函数全部内容,希望文章能够帮你解决android-使用NDK从本机代码调用Java函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1085877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存