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.