猿问

如何将类对象传递给 jni 本机方法

我想创建一个 DLL,它将一个 java 类对象作为参数。假设我创建了一些本机方法,这些方法将 Human.class 实例作为参数。为了访问人类对象,我该如何编写它的 C++ 实现?有可能吗?


(请考虑,我根本没有使用 C++ 的经验。)


我已经做了一些研究,因为看起来我需要从 C++ 访问指针。这让我有点困惑,因为此时我不明白 C++ 应该如何了解人类对象及其属性。


例如


JNI类


public class FourthJNI {


    public static native int returnAgeOfHuman(Human abc);

    public static void main(String[] args) {


        Human testHuman = new Human("ABC", 23, "M");

        /* Call to shared library */

        int ageOfHuman = FourthJNI.returnAgeOfHuman(testHuman);

        System.out.println(testHuman.toString());

        System.out.println("Age of Human: " + ageOfHuman);

    }


}

生成的头文件


/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class FourthJNI */


#ifndef _Included_FourthJNI

#define _Included_FourthJNI

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     FourthJNI

 * Method:    returnAgeOfHuman

 * Signature: (LHuman;)I

 */

JNIEXPORT jint JNICALL Java_FourthJNI_returnAgeOfHuman

  (JNIEnv *, jclass, jobject);


#ifdef __cplusplus

}

#endif

#endif

我的 C++ 实现应该是什么样子的?


犯罪嫌疑人X
浏览 115回答 1
1回答

至尊宝的传说

您必须在代码Java中解构类C++。您必须JNI逐个字段地使用方法和访问对象内部的数据。基本上,您将不得不拨打以下形状的电话/* Get int field      Take a look here, we are passing char* with      field descriptor - e.g. "I" => int */jfieldID fidInt = (*env)->GetFieldID (env, cls, "iVal", "I");jint iVal = (*env)->GetIntField (env, objarg, fidInt);printf ("iVal: %d\n", iVal);在这里给你完整的样本是没有意义的,把它放在这里会花费很多空间和时间。只需按照手册进行操作即可。
随时随地看视频慕课网APP

相关分类

Java
我要回答