<p>续上篇:http://blog.csdn.net/jimbo_lee/article/details/8694265</p>
<h3>通过包名获取其他包的Context实例</h3>
<p>Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的。这个方法有两个参数:<br> 1。packageName 包名,要得到Context的包名<br> 2。flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。</p>
<h3>java语言中byte[]与十六进制字符串转换 </h3>
<pre class="blockcode"><code class="language-java">/**
* bytes转换成十六进制字符串
*/
public static String byte2HexStr(byte[] b) {
String hs = "";
String stmp = "";
for(int n = 0; n < b.length; n++){
stmp = (Integer.toHexString(b[n] & 0XFF));
if(stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs.toUpperCase();
}
/**
* 十六进制字符串转换成bytes
*/
public static byte[] hexStr2Bytes(String src) {
int m = 0, n = 0;
int l = src.length() / 2;
byte[] ret = new byte[l];
for(int i = 0; i < l; i++){
m = i * 2 + 1;
n = m + 1;
ret[i] = uniteBytes(src.substring(i * 2, m), src.substring(m, n));
}
return ret;
}
private static byte uniteBytes(String src0,String src1) {
byte b0 = Byte.decode("0x" + src0).byteValue();
b0 = (byte) (b0 << 4);
byte b1 = Byte.decode("0x" + src1).byteValue();
byte ret = (byte) (b0 | b1);
return ret;
} </code></pre>
<p>在处理byte数组与字符串转换的时候,可以使用中间类型十六进制字符串。 </p>
<p>附: java中 byte字符处理</p>
<pre class="blockcode"><code class="language-java">/**
*将字节数组补成8的倍数,以0填充;
*/
public static byte[] addZerosForDes(byte[] source)
{
byte [] ret = null;
if(source==null || source.length%8==0)
ret = source;
else
{
int i = source.length+8-source.length%8;
ret = new byte[i];
System.arraycopy(source,0,ret,0,source.length);
}
return ret;
}
/**
*将字节数组末尾的0去掉(小于8位);
*/
public static byte[] removeZerosForDes(byte[] encoding) {
byte[] ret = null;
if (encoding != null && encoding.length > 0) {
int i = encoding.length;
while (i-1>=0) {
if (encoding[i - 1] != (byte) 0)
break;
i--;
}
ret = new byte[i];
System.arraycopy(encoding, 0, ret, 0, i);
}
return ret;
} </code></pre>
<h3> </h3>
<h1 style="margin-left:0px;"> </h1>
<h3> </h3>
<h3> </h3>
<h3> </h3>
<h3> </h3>
<h3>如何判断字符串是否可以转换成数字</h3>
<p><code>str.matches(</code><code>"\\d+"</code><code>); </code><code>// int</code></p>
<p><code>str.matches(</code><code>"\\d+(\\.)?(\\d+)?"</code><code>); </code><code>// double or float</code></p>
<p> </p>
<h3>把bitmap图片转换成byte[]数据</h3>
<p>InputStream inputStream = resource.openRawResource(resId); <br> Bitmap bitmap = BitmapFactory.decodeStream(inputStream);</p>
<p>byte[] bitmapBuffer = bitmap2ByteArray(bitmap);</p>
<pre class="blockcode"><code class="language-java">public static byte[] bitmap2ByteArray(Bitmap bitmap) {
int height = bitmap.getHeight();
int width = bitmap.getWidth();
byte[] tmpBuf = new byte[(height / 8 + 1) * width + 1];
int[] p = new int[8];
int t = 0;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y += 8) {
for (int m = 0; m < 8; m++) {
if (y + m >= height){
p[m] = 0;
}else {
p[m] = (bitmap.getPixel(x, y + m) == -1 ? 0 : 1);
}
}
int value = p[0] * 128 + p[1] * 64 + p[2] * 32 + p[3] * 16 + p[4] * 8 + p[5] * 4 + p[6] * 2 + p[7];
tmpBuf[(++t)] = ((byte) value);
}
}
byte[] realBuf = new byte[t + 1];
for (int i = 0; i < t + 1; i++) {
realBuf[i] = tmpBuf[i];
}
return realBuf;
}</code></pre>
<p> </p>
<h3>NDK开发中 在native方法中使用logcat:</h3>
<p> </p>
<pre class="blockcode"><code class="language-java">第一步:在对应的mk文件中加入:LOCAL_LDLIBS := -llog
第二步:在要使用LOG的cpp文件中加入:
#include <android/log.h>
第三步:定义各个宏
#define LOG_TAG "nativeRfidUnpack"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , LOG_TAG, __VA_ARGS__)
第四步:使用
LOGE("---Java_com_odm_rfid_RfidDevice_nativeDeviceUnpack ---");</code></pre>
<h3>NDK开发中使用第三方静态库的方法:</h3>
<p> </p>
<pre class="b |
|