设为首页 加入收藏

TOP

[ndk,2]ndk开发案例和错误处理(二)
2014-11-23 21:12:37 来源: 作者: 【 】 浏览:10
Tags:ndk 开发 案例 错误 处理
ed (first use inthis function)

4.加载库文件出错,库文件不存在 Library Hel1o not found

06-03 03:42:03.817:ERROR/AndroidRuntime(13632): Caused by: java.lang.UnsatisfiedLinkError: LibraryHel1o not found

06-03 03:42:03.817:ERROR/AndroidRuntime(13632): atjava.lang.Runtime.loadLibrary(Runtime.java:461)

06-03 03:42:03.817:ERROR/AndroidRuntime(13632): atjava.lang.System.loadLibrary(System.java:557)

06-03 03:42:03.817:ERROR/AndroidRuntime(13632): atcn.itcast.ndk2.DemoActivity. (DemoActivity.java:9)

06-03 03:42:03.817:ERROR/AndroidRuntime(13632): ... 15more

5.c的代码库没有被加载到java虚拟机里面(1.忘记加载了c代码库,2.c代码库里面没有与java里面native的方法对应的代码)

06-03 03:43:35.768:ERROR/AndroidRuntime(13972): FATAL EXCEPTION: main

06-03 03:43:35.768:ERROR/AndroidRuntime(13972): java.lang.UnsatisfiedLinkError: hello_from_c

06-03 03:43:35.768: ERROR/AndroidRuntime(13972): atcn.itcast.ndk2.DemoActivity.hello_from_c(Native Method)

6.控制台打印Buildfingerprint: 程序界面显示一下就消失了.

原因就是c代码里面的逻辑有问题,参数内存泄露,运行时的异常. 比如指针的类型不匹配

修改通过打印log的方式 定位出来错误究竟出现在哪一行的代码.

06-03 03:48:55.132: INFO/DEBUG(31): ****** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

06-03 03:48:55.132: INFO/DEBUG(31): Buildfingerprint: 'generic/sdk/generic/:2.2/FRF91/43546:eng/test-keys'

06-03 03:48:55.132: INFO/DEBUG(31): pid:15204, tid: 15204 >>>cn.itcast.ndk2 <<<

06-03 03:48:55.132: INFO/DEBUG(31):signal 11 (SIGSEGV), fault addr 8090214d

06-03 03:48:55.132: INFO/DEBUG(31): r0 8090214d r1 80902154 r2 00000006 r3 6e61687a

七、在c代码中使用logcat

1、在Android.mk文件增加LOCAL_LDLIBS += -llog

#引入liblog.so 文件: 向logcat控制台输出log对应的库文件

LOCAL_LDLIBS += -llog

2、C代码中增加

#include

#defineLOG_TAG "System.out"

#defineLOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#defineLOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

LOGI("info\n");

LOGD("debug\n");

例:

#include

#include"cn_itcast_ndk2_DemoActivity.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__)

JNIEXPORT jstring JNICALLJava_cn_itcast_ndk2_DemoActivity_hello_1from_1c

(JNIEnv * env, jobject obj){

LOGD("begin");向控制台打印log 打印出begin

//定义一个字符串的常量 (不能被修改的变量)

constchar* str1 = "hello";

LOGD("INITSTR1");

constchar* str2 = "zhang san";

LOGD("initstr2");

LOGD("str1=%s",str1);

LOGD("str2=%s",str2);

//c代码不允许修改一个字符串的常量

strcat(str1,str2);//合并两个字符串方法

LOGD("strcat");

char*str = "你好 ,中国";

return(*env)->NewStringUTF(env, str);

}

八、Ndk开发中的中文乱码问题:

1、ndk-r6以上的版本解决中文乱码问题

①、把c语言的源文件改为 utf-8的格式

②、在调用c代码的时候,模拟器就可以显示出来中文了...

ndk-r6以上的版本 在编译链接 c语言的源文件的时候 采用的编码格式是utf-8

保证所有的c代码的源文件也要是utf-8

android上在显示 字符串的时候 默认的语言集是utf-8

2、ndk-r4老的ndk版本, 在编译源代码的采用的编码集是西欧的编码集iso8859-1的编码: 所以在获取中文是iso8859-1的编码格式。

String str = hello_from_c();

new String(str.getBytes("iso8859-1"),"utf-8");

九、android.mk 文件详解:

# $ 代表调用一个makefile的函数

# call my-dir这个函数的作用就是获取当前文件所在的目录赋给 LOCAL_PATH变量

LOCAL_PATH := $(call my-dir)

# 重新初始化 gnu make的脚本环境

include $(CLEAR_VARS)

#上面的CLEAR_VARS方法 会把所有的编译环境的变量重新初始化,不会初始化 LOCAL_PATH。

#告诉编译器编译出来的可执行性文件叫什么名字,编译完以后会变成libHello.so

LOCAL_MODULE := Hello

#告诉编译器 编译的源文件的名称

LOCAL_SRC_FILES := He

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

评论

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