在NDK开发中,涉及到C语言的东西总是七七八八错误一大堆,有时候会很头疼。。。
一、常见的几个错误及其解决办法
1. android.mk文件不存在
错误代码形如:
AndroidNDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk
/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文件增加:
LOCAL_LDLIBS+= -
llog
意思就是引入log库, 库存放在platforms\android-*\arch-arm\usr\lib下。(
-l
表示引入,
log
为库名)
2. C代码中增加:
#include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
使用方法:
在C代码中直接像用printf一样来用
LOGI()与
LOGD()中任意一个。
代码如下:
//传递进x,y值, 返回二者之差. 这个是静态方法.
JNIEXPORT jint JNICALL Java_com_example_ndkjavadatatoc_NativeDataProvider_subInt(
JNIEnv *env, jclass cla, jint x, jint y)
{
//java 中 int 占 4个字节, 而c中也是占4个字节. 可以直接操作
LOGI("x is %d", x);
LOGI("y is %d", y);
return x - y;
}
三、中文乱码问题的解决办法
在NDK开发时, C代码中是不支持中文的。如果写中文的话,输出会是乱码。
解决办法:
1. 只要
将
C
代码存储为
UTF-8
的编码, 就可以用
中文字符。而GBK是不可以的。(这种方法对比较新的NDK版本有效)
2. 低版本( 如ndk-r4)的NDK用的是iso-8859-1编码,需要进一步转换才能得到中文。
转换方法:
NewString(getStringFromC().getBytes(“iso-8859-1”),”utf-8”)。(其中
getStringFromC
()为native方法,从C代码中取中文字符
)
原文地址:http://blog.csdn.net/xn4545945/article/details/9033925