在NDK开发中,涉及到C语言的东西总是七七八八错误一大堆,有时候会很头疼。。。
一、常见的几个错误及其解决办法
错误代码形如:
/cygdrive/h/heima6/jni2/ziliao/android-ndk-r7b/build/core/add-application.mk:133:*** Android NDK: Aborting... 。 停止。
解决办法:
创建
Android.mk文件。
2.android.mk文件的配置信息有错误
错误代码形如:
***Android NDK: Missing LOCAL_MODULE before including BUILD_SHARED_LIBRARY injni/Android.mk 。 停止。
解决办法:
修改
Android.mk文件中的错误。有时候可能是一些看不见的特色字符导致
,可以删除后重新建立一个。
3.c代码语法出现错误,编译不通过Error1.
错误代码形如:
make:*** [obj/local/armeabi/objs/Hello/Hello.o]Error 1
解决办法:
检查C程序代码
4.java层c代码库没有找到
错误代码形如:
Causedby: java.lang.UnsatisfiedLinkError:Library Hell0 not found静态加载代码库的时候代码库没有找到.(调用库时出错)
解决办法:
检查库库的名字
,看是否写错了。看
5.c代码函数签名出现错误(函数名出错)
错误代码形如:
Causedby: java.lang.UnsatisfiedLinkError: hello_from_c
解决办法:
C代码中函数名不合特定规范
,改过来就行了。
6. 其他隐含错误
如:在C代码中视图去访问已经释放了的内存空间。
在C代码中同样可以使用logcat来输出错误信息
,只需引入一些特定的库与文件即可。
1. 在Android.mk文件增加:
在
NDK开发时
,
C代码中是不支持中文的。如果写中文的话
,输出会是乱码。
LOCAL_LDLIBS+= -
llog
意思就是引入log库, 库存放在platforms\android-*\arch-arm\usr\lib下。(
-l
表示引入,
log
为库名)
2. C代码中增加:
#include <<span style="background-color: rgb(255, 255, 102);">android</span>/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __<span style="background-color: rgb(255, 255, 102);">android</span>_log_print(<span style="background-color: rgb(255, 255, 102);">ANDROID</span>_LOG_DEBUG<span style="background-color: rgb(255, 102, 255);">,</span> LOG_TAG<span style="background-color: rgb(255, 102, 255);">,</span> __VA_ARGS__)
#define LOGI(...) __<span style="background-color: rgb(255, 255, 102);">android</span>_log_print(<span style="background-color: rgb(255, 255, 102);">ANDROID</span>_LOG_INFO<span style="background-color: rgb(255, 102, 255);">,</span> LOG_TAG<span style="background-color: rgb(255, 102, 255);">,</span> __VA_ARGS__)
使用方法:
在C代码中直接像用printf一样来用
LOGI()与
LOGD()中任意一个。
代码如下:
//传递进x<span style="background-color: rgb(255, 102, 255);">,</span>y值<span style="background-color: rgb(255, 102, 255);">,</span> 返回二者之差. 这个是静态方法.
JNIEXPORT jint JNICALL Java_com_example_ndkjavadatatoc_NativeDataProvider_subInt(
JNIEnv *env<span style="background-color: rgb(255, 102, 255);">,</span> jclass cla<span style="background-color: rgb(255, 102, 255);">,</span> jint x<span style="background-color: rgb(255, 102, 255);">,</span> jint y)
{
//java 中 int 占 4个字节<span style="background-color: rgb(255, 102, 255);">,</span> 而c中也是占4个字节. 可以直接操作
LOGI("x is %d"<span style="background-color: rgb(255, 102, 255);">,</span> x);
LOGI("y is %d"<span style="background-color: rgb(255, 102, 255);">,</span> y);
return x - y;
}
三、中文乱码问题的解决办法
解决办法:
1. 只要
将
C
代码存储为
UTF-8
的编码
, 就可以用
中文字符。而GBK是不可以的。(这种方法对比较新的
NDK版本有效)
2. 低版本( 如
ndk-r4)的
NDK用的是iso-8859-1编码
,需要进一步转换才能得到中文。
转换方法:
NewString(getStringFromC().getBytes(“iso-8859-1”),”utf-8”)。(其中
getStringFromC
()为native方法
,从C代码中取中文字符
)
本文总结了NDK开发中常见的错误类型及其解决方法,包括处理缺失的Android.mk文件、配置错误、C代码语法问题等,并介绍了如何利用logcat进行错误排查。
1184

被折叠的 条评论
为什么被折叠?



