http://lipeng88213.iteye.com/blog/1292571
android JNI学习之六 JNI的一个框架
纯属瞎诌 大家随便看看吧
对了 首先说一下经验 强烈不推荐native方法写成静态的
1、新建若干接口 接口里面全是回调方法 这些方法 都是在jni里面调用的
下面是一个登陆的回调
登陆结果0 失败 1 成功
登陆用户的id
原因
- pubic interface ITestHandler{
- public void onLogin(int result,int userId,String reason );
- }
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);
- }
- }
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);
- }
public class TestInit{
public native void init(ITestHandler ith);
}
传入 你的所有回调函数 让jni里面获得 以便操作
接着 业务的native方法
- public class TestLogin{
- public native void login(int userId,String password);
- }
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 ");
- }
#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());
- }
- }
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");
- }
- }
public class Test extends AndroidTestCase{
public void testLogin(){
TestManager.init();
TestManager.tl.login(123,"123");
}
}
就这样 就ok了