gpt4 book ai didi

java - 在 JNI 函数(Android)之外从 C 调用 java 中的函数?

转载 作者:搜寻专家 更新时间:2023-11-01 09:34:35 24 4
gpt4 key购买 nike

我正在尝试使用 Android 中的 JNI 从我的 C 代码调用 Java 函数,但我的处境有些尴尬。

我的 C 代码在传递给库的回调中的 JNI 函数之外执行。

这里是java代码的例子

package com.my.java.package;

class MyClass {
public function handleData(byte[] data) {
doSomethingWithThisData(data);
}
}

这是一个C代码的例子

void handleData(uint8_t *data, size_t len) {
// I need to call handleData in my java
// class instance from here, but i have
// no access to a JNIEnv here.

// I don't think I can create one, since
// it has to be the same object that's
// sending JNI calls elsewhere.
}

. . .

myCLibInstance.callback = handleData;

现在只要 C Lib 做了它需要做的事情,它就会触发回调。但是我没有办法将它发送回java类来处理数据。

最佳答案

在某些版本的 Android NDK 上,JNI_GetCreatedJavaVMs 可用于获取当前 VM。但是,更好的选择是覆盖 JNI_OnLoad 并将 VM 保存在那里.使用任何一种方法,一旦拥有 VM,就可以附加到当前线程并调用该函数。

extern jint JNI_GetCreatedJavaVMs(JavaVM **vm, jsize size, jsize *size2);

static JavaVM *jvm = NULL;


static jint JNI_OnLoad(JavaVM* vm, void* reserved) {
jvm = vm;
JNIEnv *env = NULL;

if (jvm && (*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_6) == JNI_OK)
{
return JNI_VERSION_1_6;
}
return -1;
}

JavaVM* getJavaVM() {
if (jvm)
{
return jvm;
}

jint num_vms = 0;
const jint max_vms = 5;
JavaVM* vms[max_vms] = {0};
if (JNI_GetCreatedJavaVMs(vms, max_vms, &num_vms) == JNI_OK)
{
for (int i = 0; i < num_vms; ++i)
{
if (vms[i] != NULL)
{
return vms[i];
}
}
}
return NULL;
}

void handleData(uint8_t *data, size_t len) {
JavaVM *jvm = getJavaVM();

if (jvm)
{
JNIEnv *env = NULL;
if ((*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL) == JNI_OK)
{
if (env)
{
//Call function with JNI..
}

(*jvm)->DetachCurrentThread(jvm);
}
}
}

关于java - 在 JNI 函数(Android)之外从 C 调用 java 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44447454/

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