Android开发-----NDK开发中的一些常见错误及解决办法

本文详细介绍了NDK开发中遇到的常见错误及其解决办法,包括Android.mk文件问题、C代码语法错误、库加载失败、函数签名错误等,并提供了使用logcat进行错误排查的技巧,以及解决中文乱码问题的方法。
摘要由CSDN通过智能技术生成

在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代码中视图去访问已经释放了的内存空间。

二、查错利器logcat,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值