llo.c
#liblog.so 向logcat控制台输出log对应的库文件
LOCAL_LDLIBS += -llog
#代表将该c代码最终会变成一个动态库 扩展名为.so
include $(BUILD_SHARED_LIBRARY)
十、c中的静态库 与动态库:
1、如果在android.mk文件中放置下面这一句:
include$(BUILD_SHARED_LIBRARY)
代表c代码最终会变成一个动态库 扩展名为.so
2、如果在android.mk文件中放置下面这一句:
include $(BUILD_STATIC_LIBRARY)
代表最终c代码会编译成一个静态库 扩展名为.a
3、动态库与静态库比较:
一般来说 ,动态库的体积要比静态库的体积小很多.
动态库: 动态的,代码的执行的时候 依赖的函数 依赖的c代码都是动态的加载执行的.
静态库: 静态的,代码在执行之前,所有依赖的库函数 ,所有依赖的代码,都必须预先加载编译到文件里面.
4、什么时候使用静态库:
当你的公司,有一个需求:把某一个函数,某一个功能做成一个模块 供别的开发人员使用的时候
十一:ndk编程应用,java传递数据给c, c 返回数据给java
1、创建一个android工程:在内部定义一个类:在类中定义一下几个本地方法:
public class DataProvider{
/**
* 把java中的两个int类型的数据 传递给c语言,
* c语言在得到这两个数据之后,对这两个数据进行求和
* 返回回来的结果 相加后的值
* @param x
* @param y
* @return
*/
public native int add(int x ,int y);
/**
* 把java中的一个字符串传递个c语言
* c语言得到这个字符串之后对这个字符串进行一些操作
* 在字符串后面添加一个 你好.
* @param s
* @return
*/
public native StringsayHelloInC(String s);
/**
* 把java中的一个int数组 传递给c语言 ,
* c语言获取到这个int数组之后,把数组的每一个元素的值都+10
* 把相加操作之后 新的数组返回给java代码
* @param iNum
* @return
*/
public native int[] intMethod(int[] iNum); // 图片 或者 音频 视频处理的时候 需要把一个数组传递给c代码
}
2、编写c代码:Hello.c 如下:分别完成以上的操作:
#include
#include "cn_itcast_ndk3_DataProvider.h"
#include
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG,__VA_ARGS__)
/**
* 工具方法
* 作用: 把java中的string 转化成一个c语言中的char数组
* 接受的参数 envjni环境的指针
* jstr 代表的是要被转化的java的string 字符串
* 返回值 : 一个c语言中的char数组的首地址 (char 字符串)
*/
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"GB2312");
jmethodID mid =
(*env)->GetMethodID(env,clsstring,"getBytes","(Ljava/lang/String;)[B");
// String .getByte("GB2312");
jbyteArray barr=
(jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //"\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0); //
return rtn;
}
//计算两个数和的方法
JNIEXPORT jint JNICALL Java_cn_itcast_ndk3_DataProvider_add
(JNIEnv * env, jobject obj, jint x, jint y){
LOGD("x=%d",x);
LOGD("y=%d",y);
int result = x + y;
LOGD("result=%d",result);
return result;
}
//拼接字符串的方法
JNIEXPORT jstring JNICALL Java_cn_itcast_ndk3_DataProvider_sayHelloInC
(JNIEnv * env , jobjectobj , jstring jstr){
//1.把java中的string 转化成 c语言里面的char数组
char* cstr = Jstring2CStr(env,jstr);
LOGI("cstr=%s",cstr);
char* hellostr ="hello";
strcat(cstr,hellostr); //拼接两个字符串
LOGI("new cstr=%s",cstr);
return (*env)->NewStringUTF(env,cstr);
}
//操作数组的方法
JNIEXPORT jintArray JNICALL Java_cn_itcast_ndk3_DataProvider_intMethod
(JNIEnv * env , jobjectobj , jintArray jarr){
// 获取jarr的长度
// jsize (*GetArrayLength)(JNIEnv*, jarray);
//调用jni方法获取数组的长度
int len =(*env)->GetArrayLength(env,jarr);
LOGI("len =%d",len);
// jint* (*GetIntArrayElements)(JNIEnv*,jintArray, jboolean*);
//获取数组的首地址
int* carr = (*env)->GetIntArrayElements(env,jarr,0);
int i;
for(i=0;i
LOGI("arr[%d]=%d",i,*(carr+i));
*(carr+i) = *(carr+i)+10;
}
return jar