2011.12.05(七)——— android JNI学习之六 JNI的一个框架
2011.12.05(7)——— android JNI学习之六 JNI的一个框架
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了
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了