设为首页 加入收藏

TOP

[ndk,2]ndk开发案例和错误处理(三)
2014-11-23 21:12:37 来源: 作者: 【 】 浏览:19
Tags:ndk 开发 案例 错误 处理
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

首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BMP文件右旋90度[c语言] 下一篇寻找直方图中面积最大的矩形(C语..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: