Android使用JNI调用C/C++生成的.so库的流程(功能:apk卸载时调用web页面)

该博客详细介绍了如何在Android应用中使用JNI调用C/C++代码,当apk被卸载时触发打开卸载反馈网页的功能。主要步骤包括创建Java类、生成JNI头文件、编写C/C++实现、使用NDK编译生成.so库,并将其添加到Android工程中。通过此方法,实现了不依赖系统库的.dll调用。
摘要由CSDN通过智能技术生成

注:功能为在apk被卸载时,打开卸载反馈的web页面,其中linux的C代码源自http://www.cnblogs.com/zealotrouge/p/3182617.html,本文流程主要是生成.so流程、加载使用等

(核心功能代码版权是http://www.cnblogs.com/zealotrouge/的热气球所有,本人只是稍加改动)

注2:cygwin、NDK等其他配置请google


1. 在自己的apk中生成用于启动检测卸载的UninstallStatictics.java类

package jp.accessport.gamebox.utils;

import java.lang.reflect.Method;

import android.content.Context;
import android.os.Build;
import android.util.Log;

//被卸载的统计==处理

public class UninstallStatictics {

	//log
	private static final String	TAG = "UninstallStatictics";
	//生成的监听进程的库
	private static final String	S_ObserverLibrary = "observe-uninstall";
	
	//监听进程pid
	private int	m_nObserverProcessPid = -1;
	
	//初始化监听进程:此处无需实现
	private native int	initObserverProcess(String strUserSerial);
	
	//
	static {
		Log.d(TAG, "load observer process lib --> " + S_ObserverLibrary);
		System.loadLibrary(S_ObserverLibrary);
	}
	
	
	//启动后调用,用于启动监听进程
	public void start(Context context){
		//API level小于17,不需要获取userSerialNumber
		if (Build.VERSION.SDK_INT < 17)
			m_nObserverProcessPid = initObserverProcess(null);
		//否则,需要获取userSerialNumber
		else
			m_nObserverProcessPid = initObserverProcess(getUserSerial(context));
	}
	
	
	//由于targetSdkVersion低于17,只能通过反射获取
	//需要添加权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" />
	private String getUserSerial(Context context){
		Object	objUserManager = context.getSystemService("user");
		if (objUserManager == null){
			Log.e(TAG, "userManager not exist!!!");
			return null;
		}

		String	strSN = null;
		try {
			Class<?>	classSP = Class.forName("android.os.SystemProperties");
			Method		methodGet = classSP.getMethod("get", String.class);
			strSN = (String)methodGet.invoke(classSP, "ro.serialno");
		}
		catch (Exception e){
			e.printStackTrace();
		}
		
		return strSN;
	}
}

2. 因为开发环境是Windows、eclipse,所以在eclipse的工程上刷新即可生成对应的.class文件(此处是UninstallStatictics.class),刚开始是为了生成.class使用javac,好一顿折腾,最后还是没生成出来,传说是android、java共用的情况下生成比较麻烦,看来毕竟不是做java的,有些命令==还是不太熟


3. 使用javah命令生成jp_accessport_gamebox_utils_UninstallStatictics.h头文件(命名==是有规则的,不用自己标示名字),因为使用的不是简单类型,而是包含如Context==的android的类库,所以生成过程中产生各种问题,解决方法参见http://blog.csdn.net/hejinjing_tom_com/article/details/8125648

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>

/* Header for class jp_accessport_gamebox_utils_UninstallStatictics */

#ifndef _Included_jp_accessport_gamebox_utils_UninstallStatictics
#define _Included_jp_accessport_gamebox_utils_UninstallStatictics
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     jp_accessport_gamebox_utils_UninstallStatictics
 * Method:    initObserverProcess
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_jp_accessport_gamebox_utils_UninstallStatictics_initObserverProcess
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

4. 生成.h文件后,就可以写代码实现Java_jp_accessport_gamebox_utils_UninstallStatictics_initObserverProcess功能了,我生成的实现类时observe-file.c,没有对应.h文件的名字,因为在生成.so后,就不需要.h文件了,只要有.so的实现即可(且.so的名字也可随意,但内部的函数名不能随意,这个跟native的调用命名相关),代码如下

//注:因为生成.so文件后,所以不再需要对应的jp_accessport_gamebox_u
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值