• android studio ndk 开发入门


    ndk 开发没什么神秘的
    ndk 说白了就是一个交叉编译的工具链,用它来生成各个CPU架构下的静态或动态链接库,linux 下就是 .a 和 .so 文件。
    原理就是 java 通过 JNI 和 C、C++ 进行交互, 主要用于有大量计算的CPU密集型任务,如游戏和图形图像渲染等。
    在安全方面核心代码也经常打成 .so 文件,一方面是各个平台复用,另一方面是增加逆向破解的难度。
    生成 .so 文件后打包到 apk 中的 lib 文件夹下就行了。

    最原始的方法,native 代码写完后用 ndk 工具生成 .so 文件, 手动打包到 apk 中的 lib 下, 手动签名,测试成功。

    这种自己打包的方式就是太繁琐了,当然自己写个脚本或小工具也可以。

     下面看看IDE中怎么做

    1 老式方法 手动 build

    src/main/jni 下放上你的原文件 Android.mk 和 Application.mk

    ndk-build 底层包装了 gnumake, Android.mk 和 Application.mk 都是配置  makefile 的参数

    Android.mk

    LOCAL_PATH := $(call my-dir) 
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := hello   # 生成的静态链接库或动态链接库的名字, linux 下生成 libhello.so
    LOCAL_SRC_FILES := hello-jni.c # 所有的源文件,空格隔开
    
    include $(BUILD_SHARED_LIBRARY) # 生成动态链接库

     Application.mk

    APP_ABI := all   # 生成所有CPU架构下的库,如果没有 Application.mk 默认只会生成 arm 架构下的库

    hello-jni.c  没什么说的

    #include <jni.h>
    
    jstring Java_com_example_lesliefang_myapplication_MainActivity_stringFromJNI(JNIEnv *env,
                                                                                 jobject thiz) {
        return (*env)->NewStringUTF(env, "Hello from JNI !  ");
    }

    jni.h 是 jdk 中的头文件,在 jdk 安装目录下,自己有必要看一下

    java 层代码,没什么可说的

    public class MainActivity extends Activity {
        TextView textView;
    
    
        static {
            System.loadLibrary("hello");
        }
    
        public native String stringFromJNI();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            textView = (TextView) findViewById(R.id.textview1);
            textView.setText(stringFromJNI());
        }
    }

    build.gradle 中添加如下配置

    android {
    
        sourceSets{
            main{
                jni.srcDirs = [] // 阻止 gradle 自己生成 Android.mk 文件,因为我们自己写了
                jniLibs.srcDir 'src/main/libs' // 打包时从这里拿 .so 文件
            }
        }
    }

    切换到 src/main/jni 目录下执行 ndk-build 就在 libs 下生成了各个平台的库文件

    目录结构是这样的

    下面运行就行了, 自动会把你的  .so 文件打包到 apk 中的 lib 文件夹下。

    2 Android studio 1.3 后就支持集成 ndk 了,这样就不用手动 build 了, Android.mk 也可以不写了

    File->Project Structure 中配上你 ndk 的路径,没有就先下载

    这跟直接在 local.properties 写是一样的

    ndk.dir=/Users/lesliefang/leslie/android/android-ndk-r10e
    sdk.dir=/Users/lesliefang/leslie/android/android-sdk-macosx

    build.gradle 中添加一个配置

    android {
    
        defaultConfig {
            ndk {
                moduleName "hello"  // 要生成的库文件的名称
            }
        }
    }

    现在目录结构是这样的,  Android.mk 和 Application.mk 都不要了

    点击运行,自动编译生成.so文件并打包到 apk 中

    但现在 android studio 对 C 和 C++ 的调试支持还只是实验阶段 ,下次看一下 gdb 手动调试和 IDE 调试。

    JNI 远没有这么简单,要想熟练的用JNI 、C 和 C++开发还有很长的路要走

  • 相关阅读:
    Ubantu 安装Redis
    传说中的WCF(5):数据协定(a)
    传说中的WCF(4):发送和接收SOAP头
    传说中的WCF(3):多个协定
    传说中的WCF(2):服务协定的那些事儿
    传说中的WCF(1):这东西难学吗?
    Linq教程
    Installutil.exe的位置和路径
    uni-app中对输入框的判断与提示(密码格式为6-12位,必须有大小写字母和数字组成)
    uni-app系列回顾总结----项目国际化
  • 原文地址:https://www.cnblogs.com/lesliefang/p/5159561.html
Copyright © 2020-2023  润新知