2011.12.05(7)——— android JNI学习之六 JNI的一个框架

纯属瞎诌 大家随便看看吧

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

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

下面是一个登陆的回调
登陆结果0 失败 1 成功
登陆用户的id
原因
pubic interface ITestHandler{public void onLogin(int result,int userId,String reason);}


2、写回调函数的实现类
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方法

public class TestInit{public native void init(ITestHandler ith);}

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


接着 业务的native方法
public class TestLogin{public native void login(int userId,String password);}


4、写jni 或者jni调用搜库

#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、写一个管理类

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里面 处理业务 我写个测试的

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



就这样 就ok了

更多相关文章

  1. Fragment使用总结
  2. android 模拟器创建的sdcard 没有mount
  3. Android实现多线程下载图片的方法
  4. ADB适用方法
  5. android艺术开发探索之RemoteViews跨进程更新UI
  6. Android(安卓)Sensor HAL层初始化流程(基于Qualcomm平台)
  7. Android中多线程的handler与Thread
  8. android 事件机制,捕捉与事件监听总结整理(二)Event Handlers,Handli
  9. app launcher 名称不是清单文件中的android:label

随机推荐

  1. Android(安卓)Intent Activity 跳转几种
  2. Android的Bitmap处理大图片解决方法
  3. Android解析如何获取SDCard 内存
  4. Android(安卓)N进入分屏代码分析二
  5. Android(安卓)EventBus简单使用
  6. 图片常用的控件
  7. activity 设置Theme.Dialog View高度
  8. apk 反编译源码 资源文件
  9. Android编程心得-JSON使用心得(二)
  10. Android实现网络加载图片点击大图后浏览