// 1.寻找类 Student
// jclass studentClass = env->FindClass("com/derry/as_jni_project/Student"); // 第一种
jclass studentClass = env->GetObjectClass(student); // 第二种
// 2.Student类里面的函数规则 签名
jmethodID setName = env->GetMethodID(studentClass, "setName", "(Ljava/lang/String;)V");
jmethodID getName = env->GetMethodID(studentClass, "getName", "()Ljava/lang/String;");
jmethodID showInfo = env->GetStaticMethodID(studentClass, "showInfo", "(Ljava/lang/String;)V");
// 3.调用 setName
jstring value = env->NewStringUTF("AAAA");
env->CallVoidMethod(student, setName, value);
// 4.调用 getName
jstring getNameResult = static_cast<jstring>(env->CallObjectMethod(student, getName));
const char *getNameValue = env->GetStringUTFChars(getNameResult, NULL);
LOGE("调用到getName方法,值是:%s\n", getNameValue);
// 5.调用静态showInfo
jstring jstringValue = env->NewStringUTF("静态方法你好,我是C++");
env->CallStaticVoidMethod(studentClass, showInfo, jstringValue);
}
I/JNISTUDY: strChar:九阳神功
D/Student: Java setName name:AAAA
E/JNISTUDY: 调用到getName方法,值是:AAAA
D/Student: showInfo info:静态方法你好,我是C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| # JNI创建JAVA对象
Java对象:
```java import android.util.Log;
public class Student {
private final static String TAG = Student.class.getSimpleName();
public String name; public int age;
public String getName() { return name; }
public void setName(String name) { Log.d(TAG, "Java setName name:" + name); this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { Log.d(TAG, "Java setAge age:" + age); this.age = age; }
public static void showInfo(String info) { Log.d(TAG, "showInfo info:" + info); }
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
import android.util.Log;
public class Person {
private static final String TAG = Person.class.getSimpleName();
public Student student;
public void setStudent(Student student) { Log.d(TAG, "call setStudent student:" + student.toString()); this.student = student; }
public static void putStudent(Student student) { Log.d(TAG, "call static putStudent student:" + student.toString()); } }
|
JNI层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
extern "C" JNIEXPORT void JNICALL Java_com_derry_as_1jni_1project_MainActivity_insertObject(JNIEnv *env, jobject thiz) {
const char *studentstr = "com/derry/as_jni_project/Student"; jclass studentClass = env->FindClass(studentstr);
jobject studentObj = env->AllocObject(studentClass);
jmethodID setName = env->GetMethodID(studentClass, "setName", "(Ljava/lang/String;)V"); jmethodID setAge = env->GetMethodID(studentClass, "setAge", "(I)V");
jstring strValue = env->NewStringUTF("Derry"); env->CallVoidMethod(studentObj, setName, strValue); env->CallVoidMethod(studentObj, setAge, 99);
const char *personstr = "com/derry/as_jni_project/Person"; jclass personClass = env->FindClass(personstr);
jobject personObj = env->AllocObject(personClass);
jmethodID setStudent = env->GetMethodID(personClass, "setStudent", "(Lcom/derry/as_jni_project/Student;)V");
env->CallVoidMethod(personObj, setStudent, studentObj);
env->DeleteLocalRef(studentClass); env->DeleteLocalRef(personClass); env->DeleteLocalRef(studentObj); env->DeleteLocalRef(personObj);
}
|