我刚刚开始使用JNI,我遇到了以下问题.
我有一个C++库,它有一个简单的类.我有三个从Java Android项目调用的JNI方法,它们实例化所述类,分别在实例化类上调用一个方法并销毁它.我保留了对这个对象的全局引用,因此在其他两个JNI方法中我可以使用它.
我怀疑我不能这样做.当我运行应用程序时,我收到运行时错误(使用引用陈旧),我怀疑这是因为在后续调用其他JNI方法时全局引用无效.
是实现我想要的唯一方法(让对象存在多个JNI调用),实际将指向实例化类的指针传回给Java,将其保存在那里,然后将其传递回JNI函数?如果是这样,那很好,我想确保我不能用全局参考来做,而且我不只是遗漏了一些东西.
我已经阅读了有关JNI中全局/本地引用的文档和章节,但它似乎只适用于Java类,而不适用于我自己的本机C++类,或者我错了.
这是代码,如果我的描述不清楚(总结,我想知道这种持久化对象的机制是否会起作用):
Java的:
package com.test.ndktest;
import android.app.Activity;
import android.os.Bundle;
import android.app.AlertDialog;
public class NDKTestActivity extends Activity {
static {
System.loadLibrary("ndkDTP");
}
private native void initializeTestClass();
private native void destroyTestClass();
private native String invokeNativeFunction();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initializeTestClass();
String hello = invokeNativeFunction();
destroyTestClass();
new AlertDialog.Builder(this).setMessage(hello).show();
}
Run Code Online (Sandbox Code Playgroud)
}
JNI标题:
extern "C" {
jstring Java_com_test_ndktest_NDKTestActivity_initializeTestClass(JNIEnv* env, jobject javaThis);
jstring Java_com_test_ndktest_NDKTestActivity_destroyTestClass(JNIEnv* env, jobject javaThis);
jstring Java_com_test_ndktest_NDKTestActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis);
};
Run Code Online (Sandbox Code Playgroud)
JNI机构:
#include <string.h>
#include …Run Code Online (Sandbox Code Playgroud) 我有一个 mongosh 脚本,应该同步执行。我可以在 mongosh 中使用 Promise 或 async/await 吗?看来我不行了 有没有办法确保事情不会乱序执行?
例如
(1) db.clients.find({}).forEach((client) => {
db.addresses.insertMany([
{ ....
}
(2) db.addresses.find({}).forEach...
Run Code Online (Sandbox Code Playgroud)
当 1 仍在循环时,2 由 mongosh 执行。有什么想法吗?