android JNI学习之六 JNI的一个框架

http://lipeng88213.iteye.com/blog/1292571

android JNI学习之六 JNI的一个框架

纯属瞎诌 大家随便看看吧

对了 首先说一下经验 强烈不推荐native方法写成静态的

1、新建若干接口 接口里面全是回调方法 这些方法 都是在jni里面调用的

下面是一个登陆的回调
登陆结果0 失败 1 成功
登陆用户的id
原因

Java代码 复制代码 收藏代码
  1. pubic interface ITestHandler{ 
  2.     public void onLogin(int result,int userId,String reason ); 
pubic interface ITestHandler{
	public void onLogin(int result,int userId,String reason	);
}



2、写回调函数的实现类

Java代码 复制代码 收藏代码
  1. public class TestHandler implements ITestHandler{ 
  2.     public void onLogin(int result,int userId,String reason){ 
  3.         System.out.println("result : "+result + " userId: "+userId + " reason: "+reason); 
  4.     } 
public class TestHandler implements ITestHandler{
	public void onLogin(int result,int userId,String reason){
		System.out.println("result : "+result + " userId: "+userId + " reason: "+reason);
	}
}



3、写native方法

首先 是初始化的native方法

Java代码 复制代码 收藏代码
  1. public class TestInit{ 
  2.     public native void init(ITestHandler ith); 
public class TestInit{
	public native void init(ITestHandler ith);
}


传入 你的所有回调函数 让jni里面获得 以便操作


接着 业务的native方法

Java代码 复制代码 收藏代码
  1. public class TestLogin{ 
  2.  
  3.     public native void login(int userId,String password); 
public class TestLogin{

	public native void login(int userId,String password);
}



4、写jni 或者jni调用搜库

Java代码 复制代码 收藏代码
  1. #include <android/log.h> 
  2. #include "com_XXX_XXX.h" 
  3.  
  4. static JavaVM   *g_jvm; 
  5. static JNIEnv* jniEnv; 
  6. static jobject g_testInit; 
  7. static jobject g_testLogin; 
  8. static jmethodID onLogin; 
  9.  
  10.  
  11.  
  12. JNIEXPORT void JNICALL Java_com_XXX_TestInit_init(JNIEnv * env, jobject obj,jobject ith) 
  13.      
  14.     __android_log_write(ANDROID_LOG_DEBUG,"init","init start  "); 
  15.      
  16.     g_testInit = (*env)->NewGlobalRef(env,ith); 
  17.     jclass class_ith = (*env)->GetObjectClass(env,ith); 
  18.     onLogin = (*env)->GetMethodID(env,class_ith,"onLogin","(IILjava/lang/String;)V"); 
  19.     (*env)->DeleteLocalRef(env,class_ith); 
  20.     __android_log_write(ANDROID_LOG_DEBUG,"init","init end  "); 
  21.  
  22. JNIEXPORT void JNICALL Java_com_XXX_TestLogin_login(JNIEnv * env, jobject obj,jint userId,jstring password) 
  23.      
  24.     __android_log_write(ANDROID_LOG_DEBUG,"login","login start  "); 
  25.      
  26.     if(userId==123 && pasword=="123"){ 
  27.         (*env)->CallVoidMethod(env,onLogin,1,123,"ok"); 
  28.     }else
  29.         (*env)->CallVoidMethod(env,onLogin,0,123,"fail"); 
  30.     } 
  31.  
  32.     __android_log_write(ANDROID_LOG_DEBUG,"login","login end  "); 
#include <android/log.h>
#include "com_XXX_XXX.h"

static JavaVM	*g_jvm;
static JNIEnv* jniEnv;
static jobject g_testInit;
static jobject g_testLogin;
static jmethodID onLogin;



JNIEXPORT void JNICALL Java_com_XXX_TestInit_init(JNIEnv * env, jobject obj,jobject ith)
{
	
	__android_log_write(ANDROID_LOG_DEBUG,"init","init start  ");
	
	g_testInit = (*env)->NewGlobalRef(env,ith);
	jclass class_ith = (*env)->GetObjectClass(env,ith);
	onLogin = (*env)->GetMethodID(env,class_ith,"onLogin","(IILjava/lang/String;)V");
	(*env)->DeleteLocalRef(env,class_ith);
	__android_log_write(ANDROID_LOG_DEBUG,"init","init end  ");
}

JNIEXPORT void JNICALL Java_com_XXX_TestLogin_login(JNIEnv * env, jobject obj,jint userId,jstring password)
{
	
	__android_log_write(ANDROID_LOG_DEBUG,"login","login start  ");
	
	if(userId==123 && pasword=="123"){
		(*env)->CallVoidMethod(env,onLogin,1,123,"ok");
	}else{
		(*env)->CallVoidMethod(env,onLogin,0,123,"fail");
	}

	__android_log_write(ANDROID_LOG_DEBUG,"login","login end  ");
}



上面写的是大致 不一定可以运行 但是大致思路就是这样了
init的时候 获得所有对象和回调方法
在native的业务方法里面调用上面得到的回调方法


5、写一个管理类

Java代码 复制代码 收藏代码
  1. public class TestManager{ 
  2.     static
  3.         System.loadLibrary("test"); 
  4.     } 
  5.      
  6.     public static TestLogin  tl = new TestLogin();  
  7.     public static TestInit ti = new TestInit(); 
  8.      
  9.     public static void init(){ 
  10.         ti.init(new TestHandler()); 
  11.     } 
  12.      
public class TestManager{
	static{
		System.loadLibrary("test");
	}
	
	public static TestLogin  tl = new TestLogin(); 
	public static TestInit ti = new TestInit();
	
	public static void init(){
		ti.init(new TestHandler());
	}
	
}



这里面创建了很多静态的属性 都是含有native方法的类 以便你调用native方法

6、然后在Activity里面 处理业务 我写个测试的

Java代码 复制代码 收藏代码
  1. public class Test extends AndroidTestCase{ 
  2.  
  3.     public void testLogin(){ 
  4.         TestManager.init(); 
  5.         TestManager.tl.login(123,"123"); 
  6.     } 
public class Test extends AndroidTestCase{

	public void testLogin(){
		TestManager.init();
		TestManager.tl.login(123,"123");
	}
}




就这样 就ok了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值