首页 > 解决方案 > 如何使用 JNI 在 C++ 中访问 Java 类的元素

问题描述

我的任务是使用 JNI 在 C++ 中打印 Java 类中的元素值。但我不知道从哪里开始。

这是 C++ 代码:

#include "sample1.h"

JNIEXPORT void JNICALL Java_sample_methodCall
  (JNIEnv *env, jobject jobj, jobject obj)
{ 

  jclass cls = env->FindClass("sample1");
}

int main()
{
    return 0;
}

这是Java代码:

import java.util.*;

public class sample1
{
    String name="XYZ";
    public native void methodCall(sample1 obj);
    public static void main(String args[])
    {
      sample1 s = new sample1();
      s.methodCall(s);
    }
}

标签: javac++java-native-interface

解决方案


C++ 代码

#include "sample2.h"  

JNIEXPORT void JNICALL Java_sample2_callMethod(JNIEnv *env, jobject obj, jobject jobj) 

{

    jclass jcls;  

    jfieldID fid, fname;  

    jint i;  

    jstring str;  

    jcls = env->GetObjectClass(jobj);  

    fid = env->GetFieldID(jcls,"val","I");  

    fname = env->GetFieldID(jcls,"name","Ljava/lang/String;");  

    str = (jstring)env->GetObjectField(jobj, fname);  

    const char *nameUCpp = env->GetStringUTFChars(str, 0);  

    i = env->GetIntField(jobj, fid);  

    printf("%d %s", i, nameUCpp);  

    env->ReleaseStringUTFChars(str, nameUCpp);  

}  

int main()  

{  

    return 0;  

}  

Java 代码

import java.io.*;

public class sample2

{  

    public native void callMethod(sample2 s);  

    int val=7;  

    String name="Siva";  

    public static void main(String args[])  

    {  

        System.loadLibrary("sample2");  

        sample2 s = new sample2();  
        s.callMethod(s);  
    }  

}  

推荐阅读