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