前言:前几章讲述了如何访问Java的属性和属性方法,今天看一下如何访问java的实例。
----------分割线-----------
java代码:
package com.fly;
import java.util.Random;
public class TestJni {
String name;
int age;
public TestJni(String name, int age) {
super();
this.name = name;
this.age = age;
}
public native static TestJni newObjfromJni();
public static void main(String[] args) {
TestJni newObjfromJni = newObjfromJni();
System.out.println(newObjfromJni());
}
public String toString() {
return "FLY [name=" + name + ", age=" + age + "]";
}
// 加载动态库
static {
System.loadLibrary("JNI");
}
}
C代码:
#include"com_fly_TestJni.h"
JNIEXPORT jobject JNICALL Java_com_fly_TestJni_newObjfromJni
(JNIEnv *env, jclass jcs){
//函数原型jclass(JNICALL *FindClass)(JNIEnv *env, const char *name);
//得到指定的class
//第一个参数
//第二个参数 要获取class 的包名/类名
jclass fmy_class = (*env)->FindClass(env, "com/fly/TestJni");
//函数原型 jmethodID (JNICALL *GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
//第一个参数
//第二个参数 对应的 所在类名class
//第三个参数 方法名 构造方法固定为<init>
//第四个参数 签名
jmethodID method_id = (*env)->GetMethodID(env, fmy_class, "<init>", "(Ljava/lang/String;I)V");
jstring name = (*env)->NewStringUTF(env, "XiaoMing");
jint age = 12l;
//函数原型: jobject (JNICALL *NewObject)(JNIEnv *env, jclass clazz, jmethodID methodID, ...);
//第一个参数
//第二个参数 对应类class
//第三个参数 方法id
//第四个参数 可变参数 传入构造方法使用
return (*env)->NewObject(env, fmy_class, method_id, name, age);
}
运行:
----------完---------