现在的位置: 首页 > 综合 > 正文

Android ndk demo

2014年02月01日 ⁄ 综合 ⁄ 共 3621字 ⁄ 字号 评论关闭

步骤:

1.   在eclipse中新建工程新建调用本地方法

例如:新建类 ChatCore.java

所在包:com.mamarow.androidchat.chatcore;

/***********************本地方法**********************************/

//初始化sdk

    public 
native  int
InitChatCore();

   

    //释放sdk资源

    public 
native   int
ReleaseChatCore();

   

    //登录chat server

    public   native   
int
Login(String UserName,String PassWord);

   

    //重新登录 chat server

    public   
native    int
   
Relogin(StringUserName,String PassWord);

   

    //注销登录

    //public nativeboolean Logout();//底层已catch user数据,可以无参数

   

    //发送聊天请求 nat打洞

    public  
native    int
     RequiryChat(int FromUserId,int
ToUserId);

   

    //处理商务消息

    public 
native     int
   CheckBusinessMsg(int businessMsgType);

   

    //发送文本信息

   public  
native     int
    
SendTextMsg(int FromUserId,int ToUserId,StringMsg)

 

/***********************回调方法**********************************/

 

 

    //登录回调函数

    public   
void
    OnLoginCallBack(int UserId,
int loginRes)

    {

       Message msg=mHandler.obtainMessage();

       Bundle bundle=new Bundle();

       bundle.putInt("HANDLETYPE", MainHandler.HANDLE_TYPE_LOGIN);

       bundle.putInt("UserId", UserId);

       bundle.putInt("loginRes", loginRes);

       msg.setData(bundle);

       mHandler.sendMessage(msg);

    }

   

    //通知登录成功后,基本数据已经接受完毕,可以跳转到主界面

    public  
void 
OnDataPrepareCallBack()

    {

      

    }

   

    //登录成功,server推送回调函数

    public   void  OnDataReciveCallBack(ByteBuffer pBuf)

    {

      

    }

   

    //请求进行chat 回调函数

    public   
void
    OnChatUserOkCallBack(int flag)

    {

      

    }

   

    //接收文本消息回调函数

    public    void    OnTextChatMsgCallBack(int
FromUserId,
int ToUserId,StringMsg)

    {  

      

       Message msg=mHandler.obtainMessage();

        Bundle bundle=new Bundle();

       bundle.putInt("HANDLETYPE", MainHandler.HANDLE_TYPE_CHAT_TEXTMSG);

       bundle.putInt("FromUserId",FromUserId);

       bundle.putInt("ToUserId", ToUserId);

       bundle.putString("Msg", Msg);

       bundle.putInt("MsgType", 0);

       msg.setData(bundle);

       mHandler.sendMessage(msg);

    }  

/***********************静态方法**********************************/

//单例模式

    public   static 
ChatCore   getInstance()

    {

       if(sdkInstance ==null
)

       {

         sdkInstance=new ChatCore();

         mHandler=new MainHandler(sdkInstance);

       }

      

       return    
sdkInstance;

    }

 

2.   生成c 头文件

在cmd中进入(android工程) bin/classes目录下

 javah-classpath . -jni –verbose  com.mamarow.androidchat.chatcore.ChatCore

生成头文件com_mamarow_androidchat_chatcore_ChatCore.h

3.   添加jni文件夹

这个文件夹就是放原生态c/c++ 的源码的地方,我们make 的时候cygwin 就是编译这个文件夹的。

4.   在jni文件中新建 Android.mk

LOCAL_PATH :=$(call my-dir)#返回当前路径,默认的,不需要修改

include$(CLEAR_VARS)       #清除先前定义的环境变量,默认不要修改

LOCAL_MODULE := libchatcore #动态库lib名称

LOCAL_SRC_FILES := JniChatCore.cpp  #需要编译的源文件

include$(BUILD_SHARED_LIBRARY)#动态库默认的

5.   在jni文件中新建 JniChatCore.cpp(这里只贴出 login本地函数实现,其他方法类似)

JNIEXPORT     jint    JNICALL Java_com_mamarow_androidchat_chatcore_ChatCore_Login (JNIEnv * cEnv,jobject cThis, jstring cName, jstring cPwd)

{

 

   const char*uname=cEnv->GetStringUTFChars(cName,NULL);

   const char*upwd=cEnv->GetStringUTFChars(cPwd,NULL);

 

   //查找com.mamarow.androidchat.chatcore.ChatCore类,返回JAVA类的CLASS对象,

   

   jclass cls =cEnv->FindClass("com/mamarow/androidchat/chatcore/ChatCore");

   jmethodID mid=0;

   if(cls !=0)

   {

  mid=cEnv->GetMethodID(cls,"OnLoginCallBack","(II)V");

   }

 

   if(!(strcmp(uname,"wuhong")&& strcmp(upwd,"123456")))

   {

 if(mid!=0)

  {

            cEnv->CallVoidMethod(cThis, mid, 0, 1);

  }

      return 1;

   }

   else

   {

            if(mid!=0)

            {   //回调java的对象成员方法

                      cEnv->CallVoidMethod(cThis, mid, 0, 0);

            }

   return0;

   }

 

}

6.   (在ndk环境已经搭建好的情况下,$NDK是ndk在cygwin配置的环境变量,),在cygwin中新建一个目录workspace,专门用来ndk.把android工程拷贝workspace目录下,cygwin进入work\android工程名 目录, $NDK\ndk-build,假如cpp程序没有问题的话,即可生成.so动态链接库

 

7.   加载so动态链接库文件,运行workspace下Android工程

经测试,程序正确运行!

抱歉!评论已关闭.