之前我們介紹過在jni中調用java中的成員函數,這里我們來介紹下載jni中創建java中的類對象,其實跟之前一樣就是調用java類中的構造函數。
我們在之前的例子的前提下修改一個帶參數的構造函數,然后再main activety中使用native code去new一個class對象,在jni中調用構造函數傳入參數去給類的成員變量賦值,最后打印出log。
-------------------------------------------------------------
先看下構造函數:
~~~
public class Student {
private String name;
private int number;
Student(int num, String string){
name = string;
number = num;
}
~~~
在按下button的時候新建一個class 對象:
~~~
public void onClick(View v) {
if(v.getId() == R.id.button1 ){
// accessInstanceMethod("Instance Method Call");
// student=doWithObj(student);
// tv.setText("name:"+student.getName()+", number:"+student.getNumber());
Student student = createObj();
System.out.println( "name: "+student.getName()+", number: "+student.getNumber());
}
~~~
最后看下在jni中是如何做的:
~~~
jobject
Java_com_android_jni_MyJNI_createObj(JNIEnv *env,jobject jobj)
{
jobject student = NULL;
jclass student_cls = (*env)->FindClass(env,
"com/android/jni/Student");
if(student_cls == NULL)
return NULL; //can not find class Studnet
jmethodID student_mtd = (*env)->GetMethodID(env,student_cls,"<init>",
"(ILjava/lang/String;)V");
if(student_mtd == NULL)
return NULL;
jstring jstr = (*env)->NewStringUTF(env,"[Jay]");
student = (*env)->NewObject(env,student_cls,student_mtd,10,jstr);
(*env)->DeleteLocalRef(env,jstr);
return student;
}
~~~
很簡單,就是調用了NewObect來新建一個對象,之前需要FindClass,然后得到構造函數的methodID。
之后運行模擬器,使用logcat查看打印出來的消息。
----------------------------------------------------------------------------------