Android(安卓)studio 使用ndk开发JNI
16lz
2021-01-26
今天写JNI Demo搞了一天,其中遇到了许多错误,不过一一解决了,下面是我根据网上总结的开发过程:
0.配置ndk路径
在project项目的local.properties里面加上ndk路径
ndk.dir=D\:\\NDK\\android-ndk-r11b
1.在project 下的gradle.properties,里面加上:
android.useDeprecatedNdk=true
2.在app 的build.gradle的
defaultConfig里面加入
ndk { moduleName "JniTest" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86"}
moduleName 就是so库的库名。第二行打印log,第三行是支持的体系架构,完整如下
3.我们写本地方法(可以单独创建类,也可以直接在已有的类里面写),
4.调用本地方法,然后build项目(我此处,点击button,改变textview的文本),你会在 项目名\app\build\intermediates\classes\debug\(项目包名) 下找到生成的class文件
5.最重要的一步:打开as 的terminal,进入 项目名\app的main目录下,输入:
javah -d jni -classpath
我的是:
此时你会发下生成了.h文件
6.创建main.c文件(文件命任意),打开.h文件,我们复制方法名过来,写好的如下,我们再次build
* DO NOT EDIT THIS FILE - it is machine generated */#include#include #ifndef LOG_TAG#define LOG_TAG "ANDROID_LAB"#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)#endif/* Header for class lab_sodino_jnitest_MainActivity */#ifndef _Included_lab_sodino_jnitest_MainActivity#define _Included_lab_sodino_jnitest_MainActivity#ifdef __cplusplusextern "C" {#endif/* * Class: lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_education_bbk_com_myapplication_TestJJ_getString (JNIEnv * env, jobject jObj){ LOGE("log string from ndk."); return (*env)->NewStringUTF(env,"Hello From JNI!"); }#ifdef __cplusplus}#endif#endif
7.buid后,我们发现已经生成了so包,然后在代码中加载库:
static { System.loadLibrary("JniTest");}
8.运行项目,点击按钮,c代码成功调用
9.大家有什么疑问,欢迎讨论
更多相关文章
- 在Android中applicationId与package name的那些事
- 记录----编译libyuv、迁移至Android(安卓)studio的操作和遇到的
- 下载Android单个项目源码的方法
- Android适配之dimens适配终极攻略(实际项目中应用方案)
- Android(安卓)两个Activity之间传值
- cocos编译android命令
- 如何解决Android(安卓)SDK无法下载Package的问题(.net)
- Android中AIDL的使用
- 类似Lazy Android的插件,根据layout的xml文件自动生成findViewByI