android studio ndk

来源:互联网 发布:在线制作护照软件 编辑:程序博客网 时间:2024/05/16 07:25

1.使用已编译好的.so文件,直接放在main/jniLibs文件夹下面,使用类加载使用;


2.编译c/c++源代码

   (1)先是在Activity中,加载库使用,使用命令javah -d jni -classpath G:\Studio\sdk\platforms\android-22\android.jar;..\..\build\intermediates\classes\debug com.hjh.ndkdem
o.MainActivity 报找不到类异常,网上说,可先通过Build ->Make project命令执行


   在生成class文件基础上在执行以上命令,尚未测试;


(2)非Activity类测试,建立本地方法,需要生成的加载需要生成.so库,终端下

 G:\Studio\workspace\NdkDemo\app\src\main\java>   javah -jni com.hjh.ndkdemo.Test


执行以上命令,就生成h头文件,main/jni文件夹的建立,将上面生成的h头文件剪切到此,并新建.c文件实现h文件的方法,


在 local.properties 文件中设置ndk的路径:

ndk.dir=D\:\\ndk\\android-ndk-r10c
 在app build.gradle中defaultconfig下加入
ndk{    moduleName "hjhJni"  //设置库(so)文件名称}将生成编译.so库
在Windows下NDK一个bug,当仅仅编译一个文件时出现会出现此问题,解决方法就是再往jni文件夹加入一个空**.c文件即可
运行将在生成各平台的.so库,编译成功,程序未成功运行,正在查找原因。
手机与电脑断开连接在重新连接,重新编译运行,成功;
android-studio undefined reference to `__android_log_print 
jni调用的C/C++文件中,加上了日志打印,
#define LOG_TAG "Native"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)//android jni打印调试
LOGE("<<creatWatcher!>>");

报以上错误,需要加上
#include <android/log.h>头文件,然后在app的build.gradle中ndk{}内部添加
stl "stlport_static"ldLibs "log"
http://www.tuicool.com/articles/v6BNrqm

网上查找的以下资料:测试不成功;

android{}内部加上

sourceSets.main {
    jni.srcDirs = []
    jniLibs.srcDir 'src/main/libs'
}

参考以下:

最近在使用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
}

0 0
原创粉丝点击