java - 使用 JNI 创建、填充和返回 Java 类实例

标签 java java-native-interface

我正在尝试使用 JNI 函数创建 Java 类并使用 DeviceId.java 构造函数方法设置该类的一些属性。我能够使用 GetMethodID 获取构造函数方法,但我将如何创建 Device.java 的新实例,然后设置属性(setId 和 setCache)。目标是将一个完整填充的 Device.java 对象实例返回给调用者。有什么想法吗?

JNI 函数:

 JNIEXPORT jobject JNICALL Java_com_test_getID(JNIEnv *env, jclass cls) 
    {
        jmethodID cnstrctr;
        jclass c = (*env)->FindClass(env, "com/test/DeviceId");
        if (c == 0) {
            printf("Find Class Failed.\n");
         }else{
            printf("Found class.\n");
         }

        cnstrctr = (*env)->GetMethodID(env, c, "<init>", "(Ljava/lang/String;[B)V");
        if (cnstrctr == 0) {
            printf("Find method Failed.\n");
        }else {
            printf("Found method.\n");
        }

        return (*env)->NewObject(env, c, cnstrctr);
    }

Java 类:

package com.test;

public class DeviceId {
    private String id;
    private byte[] cache;

        public DeviceId(){}
    public DeviceId(String id, byte[] cache){
        this.id=id;
        this.cache=cache;
    }

    public byte[] getCache() {
        return cache;
    }

    public void setCache(byte[] cache) {
        this.cache = cache;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }   
}

最佳答案

当您调用 GetMethodID 时,您为双参数构造函数提供了签名。因此,您只需要在调用 NewObject 时传递您的 jstringjbytearray - 例如:

return (*env)->NewObject(env, c, cnstrctr, id, cache);

您不需要调用 setIdsetCache 方法,除非您决定调用 0-arg 构造函数 - 这只会使您的代码复杂化,因为您将必须为那些调用 GetMethodID 并调用它们。继续沿着您所在的路线前进更简单。

关于java - 使用 JNI 创建、填充和返回 Java 类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10130819/

相关文章:

java - 系统 loadLibrary 在多线程中使用时挂起

Java 格式化程序输出

java - 在java中使用两个同名的类

java - java中的正则表达式,搜索特定的字符串模式?

java - 如何使用 JNI 将图像作为结构参数传递给 libfprint 的 C 函数

java - 模拟一个类已加载 native 库

java - Java 中的 JSON 解码

java - AnimationTimer & JavaFX : Rectangle won't move horizontally using the setTranslateX() method. 如何移动矩形?

java - 上下文切换的 native 线程无法附加到 JVM

java - 有没有办法在我的 android 项目中模拟 JNI 方法来进行 Junit 测试?