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");
}

 

posted on 2016-01-13 15:28  qingchen1984  阅读(1577)  评论(0编辑  收藏  举报

导航