Android 号码,来电归属地 Jni 使用C++对二进制文件查询(三) APK 实现篇

 Android 号码,来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇

Android 号码,来电归属地 Jni 使用C++对二进制文件查询(二) C++实现篇

上两篇文件已经可以实现一个C++的来电归属地查询了,这次我们要把它整合到Android项目中。

 

1.Jni

 

如果你不熟悉jni的话,可以先阅读下面文章来更好地了解jni。

 

Android Jni 例子,ndk

 

如果你没有Linux Android代码环境的话,要参考下这篇文章 window下eclipse搭建android ndk环境

先看下项目结构:

 

 

如果你有Linux Android 源码环境的话,请下载这个CallHelper项目,复制到packages/apps/ 下。

没有的话参考window下eclipse搭建android ndk环境进行编译。

 

先看下APK的make文件:

 

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-java-files-under, src)

# apk name
LOCAL_PACKAGE_NAME := CallHelper

LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
LOCAL_JNI_SHARED_LIBRARIES := libphone-number-jni

# so can call jni/Android.mk
include $(call all-makefiles-under,$(LOCAL_PATH))

主要是最后一条,如果你在Linux 的终端执行  mmm packages/apps/CallHelper 时除了会生成CallHelper.apk外还会去编译jni/Android.mk 在类似out\target\product\sp8825ea\system\lib生成libphone-number-jni.so 文件。

 

再看下jni/Android.mk

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

# the .so file name, remember need lib in the front
LOCAL_MODULE    := libphone-number-jni

# the main cpp file name
LOCAL_SRC_FILES := number-jni.cpp 

LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

再看下jni/number-jni.cpp

 

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "NumberInfo.h"

//注意下这个方法名,里面有包名信息,如果要在你自己项目中使用这个号码归属地查询,包名不同的话记得要修改这里
extern "C" {
   JNIEXPORT jbyteArray JNICALL Java_com_waitingfy_callhelper_NativeFunction_getLocationFromJni(JNIEnv* env,jclass tis,jstring filename,jstring number);
};

//注意下这个方法名,里面有包名信息,如果要在你自己项目中使用这个号码归属地查询,包名不同的话记得要修改这里
JNIEXPORT jbyteArray JNICALL Java_com_waitingfy_callhelper_NativeFunction_getLocationFromJni(JNIEnv* env,jclass tis,jstring filename,jstring number)
{

    jboolean iscopy;
	 const char* fnData=(env)->GetStringUTFChars( filename, &iscopy);//get binary file name
	 const char* num = (env)->GetStringUTFChars(number, &iscopy); //get number
	  int phoneNum = 0;	
	  sscanf(num,"%7d",&phoneNum);
	NumberInfoAction action;
    char* location = action.GetCityNameByNumber(fnData,phoneNum);// get result
    jbyte *by = (jbyte*)location;
    jbyteArray jarray = env->NewByteArray(strlen(location));// change to jbytearray
    env->SetByteArrayRegion(jarray,0,strlen(location),by);
    return jarray;
}

jni/NumberInfo.h 就不列出来了。去掉了把txt转换成二进制文件的方法就留了查询方法。

 

最后看下src/com.waitingfy.callhelper/NativeFunction.java

 

 

 

package com.waitingfy.callhelper;

public class NativeFunction  {
    //方法前有native 关键词,这里的getLocationFromJni跟jni/number-jni.cpp中的遥相呼应
    public static native byte[]  getLocationFromJni(String filename,String number);
    /** Load jni .so on initialization */
    static {
         System.loadLibrary("phone-number-jni");//注:不需要lib开头和.so结束,只需要中间的名字  
    }

}

src/com.waitingfy.callhelper/GetLocationByNumber.java 就不列出来了,下载整个项目查看

 

 

中有方法把AreaData.dat 复制到/data/data/com.waitingfy.callhelper/files 中

还有过滤搜索号码,因为我们只支持小于等于7位的查询。所以一个完整的电话号码或者手机号码要先进行处理,还要考虑去掉+86,等。

还有把byte[] 转换成String的方法,主要为了处理中文乱码问题,可以参考文章android jni 中文乱码

 

相关文章:
 Android 号码,来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇

Android 号码,来电归属地 Jni 使用C++对二进制文件查询(二) C++实现篇

 Android 号码,来电归属地 Jni 使用C++对二进制文件查询(三) APK 实现篇

项目下载:

http://www.waitingfy.com/wp-content/uploads/2013/06/callhelper.rar(本地下载)

http://download.csdn.net/detail/fox64194167/5467009(CSDN下载,免积分)

 

549

4 Responses to Android 号码,来电归属地 Jni 使用C++对二进制文件查询(三) APK 实现篇

  1. […] Android 号码,来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇 Android 号码,来电归属地 Jni 使用C++对二进制文件查询(三) APK 实现篇 01 […]

  2. sowhat说道:

    大神,学习了。

  3. xh179说道:

    顶一个,正好要用到~!

Leave a Reply

Name and Email Address are required fields.
Your email will not be published or shared with third parties.