NDK Java JNI調用

這次主要學習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);

 

 

 

 

 

 

發佈了64 篇原創文章 · 獲贊 5 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章