步骤:
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工程
经测试,程序正确运行!