這次主要學習NDK C調用JAVA 類,這種做法可以作爲回調,比如JNI層獲取網絡數據 然後回調JAVA層 把獲取的網絡數據傳給應用層並顯示。
創建一個簡單的User類,和 SimpleAction.
在JNI層實例化一個User類,並設置值,傳給SimpleAction類,然後JNI層調用doLogin方法 打印出User類的信息。
public class User {
public String uid;
public String username;
public int age;
public User() {
}
public void setUid(String uid) {
this.uid = uid;
}
public void setUsername(String username) {
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "uid:" + uid + ",username:" + username + ",age:" + age;
}
}
public class SimpleAction {
private User user;
public SimpleAction() {
}
public void doLogin(){
System.err.println("doLogin:" + this.user);
}
public void setUser(User u){
this.user = u;
}
}
編譯工程後,獲取相關簽名
編寫一個native方法。
public class JNI {
public native void processAction(SimpleAction action);
}
javah命令生成頭文件
重點實現裏面的函數體。
JNIEXPORT void JNICALL Java_com_birds_android_ndk_JNI_processAction
(JNIEnv *env, jobject job, jobject actionObj) {
jclass userCls = (*env)->FindClass(env,"com/birds/android/ndk/User");
if (userCls) {
// 找到User類的 MethodId.
jmethodID mid = (*env)->GetMethodID(env,userCls,"<init>","()V");
jobject userObj = (*env)->NewObject(env,userCls,mid);
// 得到User中Set方法的Method Id
jmethodID age = (*env)->GetMethodID(env, userCls, "setAge", "(I)V");
jmethodID username = (*env)->GetMethodID(env, userCls, "setUsername", "(Ljava/lang/String;)V");
jmethodID uid = (*env)->GetMethodID(env, userCls, "setUid", "(Ljava/lang/String;)V");
// 創建2個值給uid和username的.
jstring uidv = (*env)->NewStringUTF(env,"200212");
jstring unamev = (*env)->NewStringUTF(env,"birds");
jint agev = 34;
//設置值調用方法
(*env)->CallVoidMethod(env, userObj, age, agev);
(*env)->CallVoidMethod(env, userObj, username, unamev);
(*env)->CallVoidMethod(env, userObj, uid, uidv);
//把User實例傳給SimpleAction
jclass actionCls = (*env)->GetObjectClass(env,actionObj);
jmethodID mid2 = (*env)->GetMethodID(env, actionCls, "setUser", "(Lcom/birds/android/ndk/User;)V");
(*env)->CallVoidMethod(env, actionObj, mid2, userObj);
//最後調用doLogin方法
jmethodID mid3 = (*env)->GetMethodID(env, actionCls, "doLogin", "()V");
(*env)->CallVoidMethod(env, actionObj, mid3);
}
}
在Activity裏面直接調用即OK
SimpleAction action = new SimpleAction();
new JNI().processAction(action);