我在IBM上读到了这一点
要访问Java对象的字段并调用其方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID().对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改.但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能已经从超类继承,使得JVM在类层次结构中向上移动以找到它们.因为给定类的ID是相同的,所以您应该查找它们一次,然后重复使用它们.同样,查找类对象可能很昂贵,因此它们也应该被缓存.
一个人如何缓存的methodID,fieldID以及class在JNI对象?是否有必须遵循的内置方法或特定程序?
我有一个问题,JNI整天带我走,如果我不打电话求助,可能会让我感到疯狂.
在两个短语中:我从JNI方法调用NewObject并且它工作正常,但是当我将此代码移动到另一个方法时,它会崩溃.
更多细节:
我有这个简单的类,我想从JNI C/C++代码创建它的实例:
package example;
public class ModelDetails {
public ModelDetails() { ... }
}
Run Code Online (Sandbox Code Playgroud)
具有本机方法的类如下:
package example;
public class JNIWrapper {
public native ModelDetails getModelDetails() throws SomeException;
}
Run Code Online (Sandbox Code Playgroud)
以下代码非常好用:
jclass modelDetailsClass = NULL;
jmethodID modelDetailsConstMid = NULL;
JNIEXPORT jobject JNICALL Java_example_JNIWrapper_getModelDetails
(JNIEnv *env, jobject jobj) {
cout << "getModelDetails c++" << endl;
// ModelDetails class
if (!modelDetailsClass) { // reuse class
modelDetailsClass = env->FindClass("example/ModelDetails");
}
if (!modelDetailsClass) { // check if findclass was successful
throwJavaException(env, "Could …Run Code Online (Sandbox Code Playgroud) 我正在开发一个 Android 应用程序,并且正在从 C++ 库接收相机数据。我需要将这些数据从 C++ 发送到 Java 代码。为此,我使用 JNI。我可以在 Java 中从 JNI 和 C++ 数据中设置不同的字段(例如相机的名称或类型),但我无法设置 ID 字段,因为它是一个数组uint8_t。
我怎样才能做到这一点?
我已经尝试了多种方法来执行此操作,但每次我都得到一个SIGSEGV error无效地址。对于我正在使用的其他领域
env->Set<Primitives>Field(jobject, jfieldID, value)
Run Code Online (Sandbox Code Playgroud)
方法,但没有类似int数组的方法,是吗?因此,我尝试通过调用类中的方法并提供数组int作为参数来设置此字段,但此函数失败并返回SIGSEGV error.
然后,我在网上搜索并尝试通过设置该字段
env->GetObjectField(jobject, jfieldID)
Run Code Online (Sandbox Code Playgroud)
和
env->SetIntArrayRegion(jintArray, start, end, myIntArray)
Run Code Online (Sandbox Code Playgroud)
但这里第一个方法总是返回 null。
JavaVM * mJVM; //My Java Virtual Machine
jobject mCameraObject, mThreadObject; //Previously initialize to call functions in the right thread
void onReceiveCameraList(void *ptr, uint32_t /*id*/, my::lib::Camera *arrayCamera, uint32_t nbCameras) {
JNIEnv *env;
mJVM->AttachCurrentThread(&env, nullptr);
if …Run Code Online (Sandbox Code Playgroud)