AndroidStudio Jni 开发初识
2017-01-13 16:55
393 查看
NDK 是什么?
NDK是一系列工具的集合,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk为什么使用NDK
代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
开始使用
下载ndk环境的这里不赘述了添加jni文件夹
在app下的build.gradle加入ndk的配置
写调用代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv_hello); textView.setText(strFromC()); } //声明一个native方法 public native String strFromC(); //静态代码块里加载native方法的so库,名字和之前定义的一样 //ps:静态代码块里面的代码在类初始化时会最新被加载 static { System.loadLibrary("hello_c"); } }
生成.h头文件
到调用类那个文件夹下执行javah命令javah的更多用法
在同级目录下会生成报名+类名的头文件,之后将其拖拽到jni文件下,并创建一个c文件
com_simplepeng_jnidemo_MainActivity.h
没有c基础的可以暂时不了解其中的用法和含义
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_simplepeng_jnidemo_MainActivity */ #ifndef _Included_com_simplepeng_jnidemo_MainActivity #define _Included_com_simplepeng_jnidemo_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_simplepeng_jnidemo_MainActivity * Method: strFromC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
hello_c.c
没有c基础的可以暂时不了解其中的用法和含义
//包含生成的.h头文件 #include "com_simplepeng_jnidemo_MainActivity.h" //*env 指向 JNINativeInterface 结构的指针 //obj 指向void* //所有的都可以在jni.h中找到 JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC (JNIEnv *env, jobject obj) { const char *str = "hello from c"; return (*env)->NewStringUTF(env, str); }
编译项目,生成so库
正确生成so库后就可以运行项目查看native方法是否调用成功
可以看到是成功调用到了native的方法的。
其他注意事项
在builde.gradle中配置了ndk自己就生成了Android.mk如果报没找到ndk相关配置错误,可能就需要自己在local.properties中配置ndk的目录
ndk.dir=/Users/simple/Library/Android/sdk/ndk-bundle
或者报ndk版本问题,可能也需要在gradle.properties中配置
android.useDeprecatedNdk=true
相关文章推荐
- Android项目中嵌入RN常见问题汇总
- Appium Android 元素定位方法 原生+H5
- 查看android程序的CPU和内存消耗情况
- Android studio 提示 setup sdk
- 【android】ListView 的 transcriptMode 选项
- android 仿IOS弹出框
- Android studio中TextView改变字体的两种方式(如仿宋、隶书)
- Android横竖屏切换遇到的问题
- 墨香带你学Launcher之(一)-概述
- Android性能优化典范——渲染性能(Render Performance)
- android让图片等比例缩放
- Android中使用线程池来管理线程
- Android 项目 Android 学习手册(一)
- Android 新安全机制之动态权限申请
- android View的getX getLeft getTranslateX以及MotionEvent的getX getRawX的区别与联系
- Android 简单实现View自动换行(附源码)
- android AlertDialog的简单使用
- android源码灭屏时蓝牙自动配对
- Android Studio 中使用 PullToRefresh 框架
- android自定义评分条(RatingBar)