相关疑难解决方法(0)

在JNI中,如何根据IBM的性能建议缓存类,methodID和fieldID?

在IBM上读到了这一点

要访问Java对象的字段并调用其方法,本机代码必须调用FindClass(),GetFieldID(),GetMethodId()和GetStaticMethodID().对于GetFieldID(),GetMethodID()和GetStaticMethodID(),为给定类返回的ID在JVM进程的生命周期内不会更改.但是获取字段或方法的调用可能需要在JVM中进行大量工作,因为字段和方法可能已经从超类继承,使得JVM在类层次结构中向上移动以找到它们.因为给定类的ID是相同的,所以您应该查找它们一次,然后重复使用它们.同样,查找类对象可能很昂贵,因此它们也应该被缓存.

一个人如何缓存methodID,fieldID以及class在JNI对象?是否有必须遵循的内置方法或特定程序?

java performance java-native-interface caching

21
推荐指数
2
解决办法
1万
查看次数

将对象创建移动到另一个方法后出现JNI Bus错误

我有一个问题,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)

java java-native-interface

5
推荐指数
1
解决办法
1554
查看次数

无法从 JNI 设置 Java int 数组字段

我正在开发一个 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)

c++ java java-native-interface

5
推荐指数
1
解决办法
2071
查看次数

标签 统计

java ×3

java-native-interface ×3

c++ ×1

caching ×1

performance ×1