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
原因:
默认情况下,存在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
}