• NDK常见问题


    1. 忽略编译警告为错误
    APP_CPPFLAGS += -Wno-error=format-security
    2. android studio 手动编译 __android_log_print 错误仍然存在,但是能解决手动编译问题,自动编译暂时不支持
    最近在使用android studio编译安卓程序,要用到jni
    我在jni源码中引用了__android_log_print ,且在Android.mk中加了LOCAL_LDLIBS := -llog
    但是编译时还是会出现如下错误:
    Error:(82) undefined reference to `__android_log_print'
    原因:
    默认情况下,存在src/main/jni文件夹时,gradle生成脚本会执行ndk编译生成操作,但是,编译生成方式并不是像以前那样用ndk-build去处理Android.mk Application.mk等
    进行c/c++代码的编译链接,而是在临时文件路径中重新生成了一份新的mk文件,并以此作为ndk编译项目,所以会导致log库没有被正常链接进去,导致找不到定义。

    解决方法:
    通过在app目录下的build.gradle中
    android { 
    加入配置: (注意是加在android {}之中)
    sourceSets.main {
        jni.srcDirs = []
        jniLibs.srcDir 'src/main/libs'
    }
    的方式来屏蔽掉默认的jni编译生成过程,这样执行gradle生成时就不会再处理jni中的原生代码,而由手动调用ndk-build方式去生成so动态链接库,同时下面的jniLibs.srcDir重定位生成库文件夹为ndk-build默认生成的libs文件夹(这个默认是src/main/jniLibs,当然是默认生成jni脚本执行成功的话,如果想保留不变的话也可以修改一下手动执行ndk-build时的生成路径),这时再调试运行就可以正确的嵌入native库文件执行了。
    进入jni目录,手动运行ndk-build

    如果要自动进行ndk-build,在加上面配置的基础上(注意可加在最后面,不能在android {}之中)
    在build.gradle后面加上
    task ndkBuild(type: Exec) {
       commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
    3.__android_log_print 错误 
    手动编译在 *.mk 文件 增加LOCAL_LDLIBS += -llog
    自动编译完整解决方法
    apply plugin: 'com.android.library'
    
    android {
        compileSdkVersion 21
        buildToolsVersion "21.1.2"
        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 21
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                ndk {
                    moduleName "moduleName"
                    ldLibs "log"//实现__android_log_print
                    abiFilters "armeabi", "armeabi-v7a", "x86"
                }
            }
        }
        productFlavors {
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:support-v13:21.0.3'
    }



    ldLibs "log"  是关键代码



    #include <string.h>
    #include <android/log.h>
    #include <jni.h>
    #include <stdio.h>
    
    #define  LOG_TAG    "native-dev"
    #define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
    #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    
    void testlog(){
        LOGI("test");
    }
  • 相关阅读:
    手机蓝牙各类服务对应的UUID
    Android数据传递的四种方法
    PS延迟显示的解决方法
    字符串分离函数
    利用cmd命令创建wifi热点
    我的毕业设计——无线控制平台
    只需简单一步,android自带的示例程序 BluetoothChat 变蓝牙串口助手
    volatile 关键字
    PC蓝牙开发笔记
    Jquery与CSS中的大于符号
  • 原文地址:https://www.cnblogs.com/qingchen1984/p/5127428.html
Copyright © 2020-2023  润新知