2011.12.05(7)——— android JNI学习之六 JNI的一个框架
16lz
2021-01-24
2011.12.05(7)——— android JNI学习之六 JNI的一个框架
纯属瞎诌 大家随便看看吧
对了 首先说一下经验 强烈不推荐native方法写成静态的
1、新建若干接口 接口里面全是回调方法 这些方法 都是在jni里面调用的
下面是一个登陆的回调
登陆结果0 失败 1 成功
登陆用户的id
原因
2、写回调函数的实现类
3、写native方法
首先 是初始化的native方法
传入 你的所有回调函数 让jni里面获得 以便操作
接着 业务的native方法
4、写jni 或者jni调用搜库
上面写的是大致 不一定可以运行 但是大致思路就是这样了
init的时候 获得所有对象和回调方法
在native的业务方法里面调用上面得到的回调方法
5、写一个管理类
这里面创建了很多静态的属性 都是含有native方法的类 以便你调用native方法
6、然后在Activity里面 处理业务 我写个测试的
就这样 就ok了
纯属瞎诌 大家随便看看吧
对了 首先说一下经验 强烈不推荐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了
更多相关文章
- Fragment使用总结
- android 模拟器创建的sdcard 没有mount
- Android实现多线程下载图片的方法
- ADB适用方法
- android艺术开发探索之RemoteViews跨进程更新UI
- Android(安卓)Sensor HAL层初始化流程(基于Qualcomm平台)
- Android中多线程的handler与Thread
- android 事件机制,捕捉与事件监听总结整理(二)Event Handlers,Handli
- app launcher 名称不是清单文件中的android:label