JNI's c/c++ and Java interaction, calling Java is c/c++ cleaner and logical concise

Keywords: Java

public class JniTest2 {

    //c Accessing non-static members
    public String testField="hello...";
    //c Modify java static members
    public static int time=78;
    //c access java method
    public native void invokeJavaMethod();
    //c Modify java static members
    public native void modifyStaField();
    public native static String getProgress();
    public native String getStringFromC();
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String progress=getProgress();
        System.out.println("test=from c="+progress);
        JniTest2 t=new JniTest2();
        System.out.println("test c before=="+t.testField);
        String result=t.getStringFromC();
        System.out.println("test c after=="+result);
        System.out.println("===============Static member modification==============");
        System.out.println("test=c beforestatic="+time);
        t.modifyStaField();
        System.out.println("test=c after static="+time);
        System.out.println("===============call java Method==============");
        t.invokeJavaMethod();
    }
    static {
        //Load x64.dll static library
        System.loadLibrary("JNIDateType");
    }

    public int generateRandom(int seed) {
        System.out.println("test=java Method being C Called=");
        return new Random().nextInt(seed);
    }
}

Here are c/c++ access to java members and methods

#define _CRT_SECURE_NO_WARNINGS
#include "jni_data_test_JniTest2.h"
#include<string.h>


//c Return java Layer data
JNIEXPORT jstring JNICALL Java_jni_1data_1test_JniTest2_getProgress
(JNIEnv *Env, jclass jcls){
    //Java Function in c Layer implementation
    char *progress = "95";
    return (*Env)->NewStringUTF(Env,progress);
};

//c Rewrite implementation java Method
JNIEXPORT jstring JNICALL Java_jni_1data_1test_JniTest2_getStringFromC
(JNIEnv *Env, jobject jobj){
  //obtain java Launch class
  jclass jobjclass= (*Env)->GetObjectClass(Env,jobj);
 //By reflection java member,Note that the last parameter is the data type signature“ L+Class name(Intermediate slash)"
  jfieldID jfield = (*Env)->GetFieldID(Env, jobjclass, "testField", "Ljava/lang/String;");
 //Get the current member property value
 jstring jfieldvalue = (*Env)->GetObjectField(Env,jobj,jfield);
 //Be careful: c Cannot modify jstringļ¼ŒConversion char*,Does the last parameter copy?
 char *fieldValue = (*Env)->GetStringUTFChars(Env, jfieldvalue, NULL);
 strcat(fieldValue,"what the fuck!");
 //char * Turn into jstring Return
 jstring result =(*Env)->NewStringUTF(Env,fieldValue);
 //modify java Member value
 (*Env)->SetObjectField(Env,jobj,jfield,result);
 return result;
};

//c call java Method
JNIEXPORT void JNICALL Java_jni_1data_1test_JniTest2_invokeJavaMethod
(JNIEnv *Env, jobject jobj){
    //reflex java class
    jclass javaclass=(*Env)->GetObjectClass(Env,jobj);
    //Acquisition method id,Method signature java engineering bin Catalog javap -s -p java Full class name
    jmethodID methodId=(*Env)->GetMethodID(Env,javaclass,"generateRandom","(I)I");
    //Calling method
    jint value=(*Env)->CallIntMethod(Env,jobj,methodId,89);
    printf("c call java Method results==%d==\n",value);
};

//c modify java Static member
JNIEXPORT void JNICALL Java_jni_1data_1test_JniTest2_modifyStaField
(JNIEnv *Env, jobject jobj){
   jclass  javaclz= (*Env)->GetObjectClass(Env,jobj);
   //Note member signatures
   jfieldID staFieldId=(*Env)->GetStaticFieldID(Env,javaclz,"time","I");
   //jint yes long Type, strong turn
  jint fieldValue= (*Env)->GetStaticIntField(Env,javaclz,staFieldId);
  fieldValue += 15;
  //Modify Completion Settings static member
  (*Env)->SetStaticIntField(Env,javaclz,staFieldId,fieldValue);
};

The results are as follows: Workspace GBK and UTF8 do not coordinate scrambling

Summary: One of the most noteworthy is the command way to get signatures from all members of a java class
// Sign, enter the java engineering bin directory java p-s-p java full class name
The signature of the member in the java class is shown in red in the following figure

C/c++ has many methods that are not available, but Java does. If it is inconvenient to implement c/c++ itself, it is better to call the existing java, which is also the embodiment of object-oriented thought.

Posted by Takuma on Fri, 08 Feb 2019 21:39:18 -0800