为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

犯罪嫌疑人X 2023-06-08 17:45:12
我想创建一个 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 __cplusplusextern "C" {#endif/* * Class:     FourthJNI * Method:    returnAgeOfHuman * Signature: (LHuman;)I */JNIEXPORT jint JNICALL Java_FourthJNI_returnAgeOfHuman  (JNIEnv *, jclass, jobject);#ifdef __cplusplus}#endif#endif我的 C++ 实现应该是什么样子的?
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您必须在代码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);

在这里给你完整的样本是没有意义的,把它放在这里会花费很多空间和时间。只需按照手册进行操作即可。

查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信