Android Studio中使用NDK
2015-12-07 22:25
351 查看
编译环境
Win10 64bit 企业版Android Studio 1.5
android-ndk-r10e
Here we go!
新建项目这里新建一个项目名为
FFmpegDemo的项目(过程略)
声明native方法
在
MainActivity中声明native方法:
public native String getStringFromNative();
然后
Build - Make Project
之后可以在
FFmpegDemo\app\build\intermediates\classes\debug\com\example\l1\ffmpegdemo下看到class中间文件
生成头文件(.h)
在Android Studio的Terminal中进入项目main目录,并运行下面命令以生成头文件:
javah -d jni -classpath E:\Android\AndroidStudioSDK\platforms\android-19\android.jar; E:\Android\AndroidStudioSDK\extras\android\support\v4\android-support-v4.jar; E:\Android\AndroidStudioSDK\extras\android\support\v7\appcompat\libs\android-support-v4.jar; E:\Android\AndroidStudioSDK\extras\android\support\v7\appcompat\libs\android-support-v7-appcompat.jar;
-d:表示新建目录
-classpath:指定类路径
我这边如果不指定类路径会出现错误:
错误: 无法访问android.support.v7.app.AppCompatActivity 找不到android.support.v7.app.AppCompatActivity的类文件
运行完命令后,将会多一个jni目录,并且里面有个头文件(.h)
实现头文件中声明的方法
在jni目录下新建一个
.c文件,用以实现
.h头文件中的声明方法。这里命名为
main.c,并简单的返回字符串。
#include "com_example_l1_ffmpegdemo_MainActivity.h" JNIEXPORT jstring JNICALL Java_com_example_l1_ffmpegdemo_MainActivity_getStringFromNative(JNIEnv *env, jobject obj) { return (*env)->NewStringUTF(env,"Hello JNI"); }
配置NDK路径和指定动态库名称
在
local.properties增加NDK路径,文件变成:
sdk.dir=E:\\Android\\AndroidStudioSDK ndk.dir=E:\\Android\\android-ndk-r10e
此外,还要在
gradle.properties文件中加入:
android.useDeprecatedNdk=true
否则会报错:
Error:Execution failed for task ':app:compileDebugNdk'. > Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
点击
Build - Make Project可以在
FFmpegDemo\app\build\intermediates\ndk\debug\lib\armeabi下看到
libapp.so文件,这是默认的动态库名称,我们可以在
build.gradle(Module:app)文件里指定动态库名称:
android { ... defaultConfig { ... ndk { moduleName "MyLib" //指定生成动态库的名称 } } ... }
重新编译即可看到
libapp.so变成了
libMyLib.so
使用native方法
最后在
MainActivity中增加动态库载入代码就可以调用
native方法啦~
public class MainActivity extends AppCompatActivity {
//载入动态库
static {
System.loadLibrary("MyLib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.my_tv);
tv.setText(getStringFromNative()); //调用native方法
}
//声明native方法
public native String getStringFromNative();}
编译运行就可以在屏幕上看到
Hello JNI啦~~
C语言中输出Logcat?没问题!
要想在C语言实现代码中输出Logcat信息,其实很简单!!首先,在
main.c中包含
#include <android/log.h>,然后调用
__android_log_print()打印输出。
#include "com_example_l1_ffmpegdemo_MainActivity.h" #include <android/log.h> #define TAG "JNI_TAG" //为了方便调用,将输出宏定义 #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) JNIEXPORT jstring JNICALL Java_com_example_l1_ffmpegdemo_MainActivity_getStringFromNative(JNIEnv *env, jobject obj) { //输出Logcat LOGD("Logcat text"); //或像C语言printf()一样 LOGD("%s You are No.%d","Logcat so easy!", 1); return (*env)->NewStringUTF(env,"Hello JNI"); }
然后,在
build.gradle中增加链接库。
android { ... defaultConfig { ... ndk { moduleName "MyLib" //指定生成动态库的名称 ldLibs "log" //增加链接库 } } ... }
重新编译就可以在Logcat窗口看到输出啦~
参考:
Using the NDK with Android* Studio
How to get “printf” messages written in NDK application?
相关文章推荐
- Android
- Android样式开发——selector篇
- Android Third Party Libraries and SDK's
- android - Settings
- 对于接口比较深入的认识
- 【Android】手写Android异步加载框架
- Android之EventBus
- Android如何让ListView的子组件按钮响应单击事件并修改该项子控件内容
- Android ExpandableListView
- Android Log等级的介绍
- Android的5个进程等级
- android 计算view 高度
- Android--MVP设计思想
- Android中自定义TextView的形状
- android4.4切换横屏的生命周期w
- Android消息机制 Handler源码分析
- 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题
- Android - Menus
- android SoundPool播放音效(二)
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法