【发布时间】:2021-03-15 14:01:36
【问题描述】:
线程 1 是主线程。 我有一个在线程 2 中执行的 c++ 代码(我产生的工作线程)。 我想在主线程中执行一个原生函数并等待结果
printf("I am on thread : %s", getthreadid());
int ret = executeOnMainWait(mynativefunc1("hello"));
printf("ret : %d", ret);
printf("I am on thread : %s", getthreadid());
bool b = executeOnMainWait(mynativefunc2(4, 5));
printf("b : %d", b);
int mynativefunc1(char* param) {
printf("mynativefunc1 I am on thread : %s", getthreadid());
if(strcmp(param, "hello")) {
return 1;
}
return 2;
}
bool mynativefunc2(int val1, int val2) {
printf("mynativefunc2 I am on thread : %s", getthreadid());
return (val1 + val2) == 5;
}
所以这段代码应该显示:
I am on thread 2
mynativefunc1 I am on thread 1
ret : 1
I am on thread 2
mynativefunc2 I am on thread 1
b : true
我认为我们需要通过jni进入java世界并使用处理程序并将一些东西发布到主线程然后等待它完成,但问题我不知道如何直接传递带有自己参数的函数指针.这个例子只展示了 2 个原生函数,但实际上我有 20 个。 非常感谢
【问题讨论】:
-
不,这是与互斥锁同步。我需要将 lambda 从 c++ 传递到 java 并等待(通过使用信号量)
-
Java 不能调用 lambda 但可以调用 JNI 方法。所以你必须定义一个特定的 C++ 方法,然后用你的普通参数调用 Java,当 Java 完成时,它会调用那个特定的 C++ 方法。看来你已经知道 Mutex/Semaphore,所以我不会写给你。
-
谢谢,你认为我需要做什么来定义这个接受可变参数并返回可变返回码的特定 c++ 函数?
-
只需调用(从 Java 中)这个“特定 C++ 方法”,因为您正在调用运行您在此处发布的代码的当前 C++ 方法。类似于“JNIEXPORT JNICALL jint Java_com_your_package_cppMethod(env, clazz, arg1, arg, ....) { ... }”的东西,在这种方法中,您将使用 Mutex/Semaphore 进行线程同步。
标签: android android-ndk