JNI访问Java中各方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daividtu/article/details/78126835


#include <stdio.h>
#include "com_ican_twy_JniTest.h"
#include <Windows.h>
#include <string.h>

//访问非静态方法
JNIEXPORT void JNICALL Java_com_ican_twy_JniTest_accessMethod
(JNIEnv * env, jobject jobj) {
	jclass jclaz = (*env)->GetObjectClass(env, jobj);
	//方法的名字,方法的签名
	jmethodID mid = (*env)->GetMethodID(env, jclaz, "getRandomInt", "(I)I");
	//调用
	jint random = (*env)->CallIntMethod(env, jobj, mid, 200);
	printf("c random %d \n", random);
}

//JNI 访问Java 中的静态方法
JNIEXPORT void JNICALL Java_com_ican_twy_JniTest_accessStaticMethod
(JNIEnv * env, jobject jobj) {
	//jclass, 通过jobjcct 来搜索class,如果找到了,将这个class 转变成jclass,然后返回。
	jclass jc = (*env)->GetObjectClass(env, jobj);
	//jmethdId,GETStaticMethodID  方法的名字,方法的签名
	jmethodID jmid = (*env)->GetStaticMethodID(env, jc, "getRandeomUUId", "()Ljava/lang/String;");
	// 调用静态方法
	jstring jstr = (*env)->CallStaticObjectMethod(env, jc, jmid);
	//jstring -> char *
	char * uuid_c = (*env)->GetStringUTFChars(env, jstr, NULL);
	char filename[100];
	sprintf(filename, "D://%s.txt", uuid_c);
	FILE *fp = fopen(filename, "w");
	fputs("I love Av", fp);
	fclose(fp);
	printf("文件写入成功\n");
}
//访问java构造方法
JNIEXPORT jobject JNICALL Java_com_ican_twy_JniTest_accessConstructor
(JNIEnv * env, jobject jobj) {
	//通过类的路径来从JVM 里面找到对应的类
	jclass jc = (*env)->FindClass(env, "java/util/Date");
	jmethodID jmid = (*env)->GetMethodID(env, jc, "<init>", "()V");
	//调用 newObject 实例化Date 对象,返回值是一个jobjcct
	jobject date_obj = (*env)->NewObject(env, jc,jmid);
	//得到对应对象的方法,前提是,我们访问了相关对象的构造函数创建了这个对象
	jmethodID time_mid = (*env)->GetMethodID(env, jc, "getTime", "()J");
	jlong time = (*env)->CallLongMethod(env, date_obj, time_mid);
	printf("time:%lld \n", time);
	return date_obj;
}

JNIEXPORT jstring JNICALL Java_com_ican_twy_JniTest_chineseChars
(JNIEnv * env, jobject jobj, jstring in) {
	//jboolean iscp;
	//char * c_str = (*env)->GetStringChars(env, in, &iscp);
	//if (iscp == JNI_TRUE)
	//{
	//	printf("is copy: JNI_TRUE\n");
	//}
	//else if (iscp == JNI_FALSE)
	//{
	//	printf("is copy: JNI_FALSE\n");
	//}

	//int length = (*env)->GetStringLength(env, in);
	//const jchar * jcstr = (*env)->GetStringChars(env, in, NULL);
	////jchar -> char
	//char * rtn = (char *)malloc(sizeof(char) * 2 * length + 3);
	//memset(rtn, 0, sizeof(char) * 2 * length + 3);
	//int size = 0;
	//size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn, sizeof(char) * 2 * length + 3, NULL, NULL);
	//printf("string: %s\n", rtn);//string 宝宝
	//if (iscp) {
	//	(*env)->ReleaseStringChars(env, in, c_str);// JVM 使用。通知JVM c_str 所指的空间可以释放了
	//}
	//return NULL;

	char *c_str = "马蓉与宝宝";
	jclass str_cls = (*env)->FindClass(env, "java/lang/String");
	jmethodID jmid = (*env)->GetMethodID(env, str_cls, "<init>", "([BLjava/lang/String;)V");
	
	//jstring -> jbyteArray
	jbyteArray bytes = (*env)->NewByteArray(env, strlen(c_str));
	// 将Char * 赋值到 bytes
	(*env)->SetByteArrayRegion(env, bytes, 0, strlen(c_str), c_str);
	jstring charsetName = (*env)->NewStringUTF(env, "GB2312");

	return (*env)->NewObject(env, str_cls, jmid, bytes, charsetName);
}



猜你喜欢

转载自blog.csdn.net/daividtu/article/details/78126835