通过so获取android 系统id:
JNIEXPORT jstring Java_com_xxxxx_init(JNIEnv* env, jobject thiz, jobject jCtxObj){
jclass jCtxClz= (*env)->FindClass(env,"android/content/Context");
jclass jclz = (*env)->GetObjectClass(env,jCtxObj);
jmethodID mid_getContentResolver = (*env)->GetMethodID(env,jclz,"getContentResolver","()Landroid/content/ContentResolver;");
jobject contentresolver = (*env)->CallObjectMethod(env,jCtxObj,mid_getContentResolver);
jclass jsetsystem= (*env)->FindClass(env,"android/provider/Settings$System");
jfieldID fid_android_id = (*env)->GetStaticFieldID(env,jsetsystem,"ANDROID_ID","Ljava/lang/String;");
jstring jstr_android_id = (jstring)(*env)->GetStaticObjectField(env,jsetsystem,fid_android_id);
//invoke-static {v1, v2}, Landroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
jsetsystem = (*env)->FindClass(env,"android/provider/Settings$Secure");
jmethodID mid_getstring = (*env)->GetStaticMethodID(env,jsetsystem,"getString","(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
jstring jstr_id = (jstring)(*env)->CallStaticObjectMethod(env,jsetsystem,mid_getstring,contentresolver,jstr_android_id);
if(jstr_id!=NULL)
{
const unsigned char* tmp = (*env)->GetStringUTFChars(env,jstr_id, NULL);
if(tmp)
{
systemid = (unsigned char*) malloc(strlen(tmp)+1);
strcpy(systemid,tmp);
(*env)->ReleaseStringUTFChars(env,jstr_id, tmp);
LOGI("systemid %s",systemid);
}
}
}
通过so获取 WifiMAC:
char* getMacAddress(JNIEnv *env, jobject wifiInfoObj){
//LOGI("getMacAddress.... ");
if(wifiInfoObj == NULL){
return NULL;
}
jclass jclz = (*env)->GetObjectClass(env,wifiInfoObj);
jmethodID mid = (*env)->GetMethodID(env,jclz,"getMacAddress","()Ljava/lang/String;");
jstring jstr_mac = (jstring)(*env)->CallObjectMethod(env,wifiInfoObj,mid);
if(jstr_mac == NULL){
(*env)->DeleteLocalRef(env,jclz);
return NULL;
}
const char* tmp = (*env)->GetStringUTFChars(env,jstr_mac, NULL);
char* mac = (char*) malloc(strlen(tmp)+1);
memcpy(mac,tmp,strlen(tmp)+1);
(*env)->ReleaseStringUTFChars(env,jstr_mac, tmp);
(*env)->DeleteLocalRef(env,jclz);
return mac;
}
jobject getWifiManagerObj(JNIEnv *env, jobject thiz, jobject jCtxObj )
{
//LOGI("gotWifiMangerObj ");
//获取 Context.WIFI_SERVICE 的值
//jstring jstr_wifi_serveice = env->NewStringUTF("wifi");
jclass jCtxClz= (*env)->FindClass(env,"android/content/Context");
jfieldID fid_wifi_service = (*env)->GetStaticFieldID(env,jCtxClz,"WIFI_SERVICE","Ljava/lang/String;");
jstring jstr_wifi_serveice = (jstring)(*env)->GetStaticObjectField(env,jCtxClz,fid_wifi_service);
jclass jclz = (*env)->GetObjectClass(env,jCtxObj);
jmethodID mid_getSystemService = (*env)->GetMethodID(env,jclz,"getSystemService","(Ljava/lang/String;)Ljava/lang/Object;");
jobject wifiManager = (*env)->CallObjectMethod(env,jCtxObj,mid_getSystemService,jstr_wifi_serveice);
//因为jclass 继承自 jobject,所以需要释放;
//jfieldID、jmethodID是内存地址,这段内存也不是在我们代码中分配的,不需要我们来释放。
(*env)->DeleteLocalRef(env,jCtxClz);
(*env)->DeleteLocalRef(env,jclz);
(*env)->DeleteLocalRef(env,jstr_wifi_serveice);
return wifiManager;
}
jobject getWifiInfoObj(JNIEnv *env, jobject wifiMgrObj)
{
//LOGI("getWifiInfoObj ");
if(wifiMgrObj == NULL){
return NULL;
}
jclass jclz = (*env)->GetObjectClass(env,wifiMgrObj);
jmethodID mid = (*env)->GetMethodID(env,jclz,"getConnectionInfo","()Landroid/net/wifi/WifiInfo;");
jobject wifiInfo = (*env)->CallObjectMethod(env,wifiMgrObj,mid);
(*env)->DeleteLocalRef(env,jclz);
return wifiInfo;
}
//调用?
char * user_mac="\0";
JNIEXPORT jstring Java_com_xxxx_init(JNIEnv* env, jobject thiz, jobject jCtxObj)
{
//strcpy(user_mac,tmp_mac);
jobject wifiManagerObj = NULL ;
jobject wifiInfoObj = NULL;
//LOGI("getDeviceInfo......");
//try
{
wifiManagerObj = getWifiManagerObj(env,thiz,jCtxObj);
if (wifiManagerObj!=NULL)
{
wifiInfoObj = getWifiInfoObj(env,wifiManagerObj);
if (wifiManagerObj!=NULL)
{
char * wifimac = getMacAddress(env,wifiInfoObj);
if(wifimac != NULL)
{
//LOGI("mac: %s",wifimac);
//if(strcmp(tmp_mac,wifimac))
{
user_mac = (char*) malloc(strlen(wifimac)+1);
strcpy(user_mac,wifimac);
//LOGI("user_mac: %s",user_mac);
}
}
}
}
}
(*env)->DeleteLocalRef(env,wifiInfoObj);
(*env)->DeleteLocalRef(env,wifiManagerObj);
return (*env)->NewStringUTF(env, "OK");
}
so中通过libcurl发送http请求并返回结果:
typedef struct pageInfo_t{
char *data;
int len;
} pageInfo_t;
static char * get_http_content(char * strurl);
static size_t HTTPData(void *buffer, size_t size, size_t nmemb, void *userData)
{
int len = size * nmemb;
pageInfo_t *page = (pageInfo_t *)userData;
if (buffer && page->data && (page->len + len < (16 * 10240)) )
{
memcpy(&page->data[page->len], buffer, len);
page->len += len;
}
return len;
}
static char * get_http_content(char * strurl)
{
pageInfo_t page;
CURL *curl;
CURLcode res;
char * buffer;
static char errorBuffer[CURL_ERROR_SIZE];
if (strurl == NULL)
{
return NULL; /* OutOfMemoryError already thrown */
}
LOGI("URL %s",strurl);
page.data = (char *)malloc(16 * 10240);
page.len = 0;
if (page.data)
memset(page.data, 32, 16 * 10240);
//buffer = (char *)malloc(16 * 10240);
//buffer[0]='\0';
curl = curl_easy_init();
if(curl)
{
res = curl_easy_setopt(curl, CURLOPT_URL, strurl);
//LOGI("CURLOPT_URL %d",res);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
//LOGI("CURLOPT_WRITEFUNCTION %d",res);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);
//LOGI("CURLOPT_WRITEDATA %d",res);
res = curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip"); // Accept-Encoding
//LOGI("CURLOPT_ENCODING %d",res);
res = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); // error_buff used to save error info
//LOGI("CURLOPT_ERRORBUFFER %d",res);
res = curl_easy_perform(curl);
//LOGI("curl_easy_perform %d",res);
/* always cleanup */
curl_easy_cleanup(curl);
if(res == 0)
{
if (page.data)
{
//page.data[page.len < 256 ? page.len : 256] = '\0';
page.data[page.len] = '\0';
//LOGI("URL Data Len = %d \n", page.len );
//strcpy(buffer,page.data);
//LOGI("buffer(%d): %s. done.\n", strlen(buffer), buffer);
//free(page.data);
//return buffer;
return page.data;
}
}
//sprintf(buffer, "Result %d", res);
//LOGI("Error %d,More:%s",res,errorBuffer);
//return buffer;
return "";
}
else
{
return "Error of Init cURL";
}
}