`

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

阅读更多
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了
分享到:
评论

相关推荐

    java读写注册表jar包,com.ice.jni.registry

    META-INF/MANIFEST.MF com.ice.jni.registry.HexNumberFormat.class com.ice.jni.registry.NoSuchKeyException.class com.ice.jni.registry.NoSuchValueException.class com.ice.jni.registry.RegBinaryValue.class ...

    Android--JNI-Device.zip_Android jni_android_jni_jni android

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C++或C)编写的代码进行交互。这个“Android--JNI-Device.zip”文件显然是一个关于Android平台上使用JNI与硬件设备...

    jni.zip_Android jni_android_jni_jni android

    本资源“jni.zip_Android jni_android_jni_jni android”包含了一份关于Android环境下JNI使用的详细指南。 JNI的核心概念主要包括以下几个方面: 1. **本地方法接口**:JNI定义了一套API,使得Java代码可以调用C/...

    Java registry,com.ice.jni.registry

    com.ice.jni.registry.RegMultiStringValue.class com.ice.jni.registry.RegBinaryValue.class com.ice.jni.registry.RegistryException.class com.ice.jni.registry.NoSuchValueException.class ...

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    "hello-jni"是学习JNI开发的经典入门案例,它展示了如何创建一个简单的Android工程,然后在其中集成本地C/C++代码。 1. 创建项目结构 首先,我们需要一个Android Studio工程,包含一个Java类(通常命名为HelloJni)...

    android-jni.zip_Android jni_android_jni_jni android

    Android JNI(Java Native Interface)是Android系统中一个重要的技术,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着不可或缺的角色,尤其是在进行性能优化、利用硬件加速、调用C/C++库或者...

    JniCallback.zip_Android jni_android_jni android_jni callback_jni

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、使用现有的C/C++库、或者像在这个“JniCallback.zip”文件...

    jni.rar_Android jni_JAVA串口 JNI_android_android RS232_jni

    在描述中提到的“jni.rar”压缩包中,包含了一个JNI封装串口通信的实例。这个实例的开发流程大致分为以下几个步骤: 1. **创建JNI接口**:在Java层定义JNI函数,声明要调用的C/C++方法。例如,可以定义一个`...

    Android JNI 调用 Silk 音频编解码包

    3. **设置jni目录**:在你的Android项目的`jni`目录下创建一个新目录,例如`libsilk`,将Silk源码复制到这个目录。 4. **编译库**:使用Cygwin或其他Linux环境模拟器,如MinGW,打开终端并导航到`jni`目录。运行`...

    jni.h头文件

    学习JNI编程时,确保正确配置了Java开发环境,并在C/C++项目中包含`jni.h`头文件是基础步骤。然后,通过理解并使用头文件中定义的数据类型、函数和常量,可以创建本地库,实现Java与本地代码的交互。同时,`jni_md.h...

    android--JNI.zip_android_android 驱动_jni_jni android

    Android JNI,全称为Java Native Interface,是Android系统中用于连接Java层和原生代码(C/C++)的一个关键技术。JNI允许开发者在Android应用中调用本地方法,从而利用C和C++的强大性能和库来解决特定问题,比如优化...

    AndroidJNI.rar_Android jni_android

    本资料"AndroidJNI.rar_Android jni_android"可能包含一个简单的示例项目——HelloWorld,用于教学如何在Android应用中使用JNI。 首先,我们来理解JNI的基本概念。JNI是一套接口,使得Java虚拟机(JVM)能够调用...

    JNI的两个头文件jni.h和jni_md.h

    本文将深入探讨JNI的两个核心头文件——`jni.h`和`jni_md.h`。 首先,`jni.h`是JNI的主要接口头文件,包含了所有JNI的函数声明和数据类型定义。当你在C或C++程序中使用JNI时,需要包含这个头文件。`jni.h`提供了...

    jni.zip jni编译jni下载

    JNI,全称Java Native Interface,...在提供的压缩包`jni.zip`中,包括了`jni.h`和`jni_md.h`两个头文件,它们是进行JNI编程的基础。开发者可以下载这些文件,以便在自己的项目中引用,从而实现Java和本地代码的交互。

    I2CJNI.rar_Android jni_android_android i2c_android i2c通信 JNI_i2c

    综上,"I2CJNI.rar"提供了一个使用Android JNI进行I2C通信的实践案例,对于学习如何在Android平台上通过JNI访问硬件资源,尤其是与I2C设备交互的开发者来说,这是一个宝贵的参考资料。通过研究这个项目,开发者可以...

    DELPHI开发JNI必备 jni.pas

    标题中的"DELPHI开发JNI必备 jni.pas"表明这是一个针对Delphi开发者的资源,其中包含的`jni.pas`文件是用Delphi编写的,目的是支持在Delphi项目中使用JNI来调用本地C/C++库或Java方法。`jni.pas`通常会封装JNI的C...

    jni.h文件,完美适配ida软件,直接就可以使用。

    在给定的压缩包文件中,包含了一个名为"jni.h"的头文件,这是JNI接口定义的核心部分。 `jni.h`文件是JNI开发的基础,它包含了所有的JNI函数声明和数据类型定义。这个头文件通常被Java本地方法(即用C/C++编写的函数...

    AndroidStudio环境下的jni调用(NDK)

    AndroidStudio环境下的jni调用(NDK),这个教程可以让完全不会AndroidStudio的人学会jni调用。完全步骤话,非常简单。

    最新java操作注册表的com.ice.jni.registry依赖压缩包

    这里提到的`com.ice.jni.registry`是一个Java库,它提供了这样的功能,利用JNI(Java Native Interface)技术实现了对注册表的原生访问。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互,特别是在...

    android JNI学习三实例

    Android JNI(Java Native Interface)是Android平台上的一个关键特性,它允许Java代码和其他语言写的代码进行交互,通常用于提升性能、调用系统底层库或利用C/C++的库。在这个"android JNI学习三实例"中,我们将...

Global site tag (gtag.js) - Google Analytics