gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:11 26 4
gpt4 key购买 nike

前几天我问过这个问题,但不是太具体,所以我想重新澄清一下。

我正在创建一个 Android 应用程序,它使用 NDK 使用 C 中的现有库。我遇到的问题是 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 世界的接口(interface)。 FindClassGetMethodID等都在其中。

所以当你想从 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 从 native 代码调用 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com