Andorid 生成NDK动态链接库 .so库

时间:2022-09-10 15:50:40

  .so库第一次见到是在搜索Android保存静态秘钥等特殊id字段做法时看到的-通过NDK的方式将静态秘钥保存在so文件中, 关于原生开发工具包(NDK)详细见官网指南要更详细,这里我记录我度娘各种结果后的实现.

  在工具中添加自定义工具添加javah命令和dnk-build命令

  Andorid 生成NDK动态链接库 .so库

  Andorid 生成NDK动态链接库 .so库

 这里name:自定义命令名

  Program:$JDKPath$/bin/javah  $JDKPath$JDK路径  

  Parameters:-classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$    生成的.h文件命令

  Working directory:$ModuleFileDir$/src/main/java  文件生成后存放的目录-这个会在项目一级目录的src/main/java 下生成一个jni文件夹 .h文件就存放在里面

下面添加ndk-build命令:

  Andorid 生成NDK动态链接库 .so库

  命令工具添加后 我们先来生成JNIDemo类

  

public class JNIDemo {
    public native void testHello();
    public static void main(String[] args){
        //加载C文件
        System.loadLibrary("TestJNI");
        JNIDemo jniDemo = new JNIDemo();
        jniDemo.testHello();
    }
}

   Andorid 生成NDK动态链接库 .so库

  选中java文件右键 通过External Tools生成javah文件,成功后会在/src/main 下生成jni文件夹 .h文件

Andorid 生成NDK动态链接库 .so库

  如上图,.h文件生成后这个时候我们需要自己创建c/c++文件 JNIDemo.cpp  将.h中方法和属性粘贴复制过去

JNIDemo.h

Andorid 生成NDK动态链接库 .so库

 JNIDemo.cpp

Andorid 生成NDK动态链接库 .so库

 

这里具体怎么写,其实本人也不知道哈哈哈~,可以搜下相关JNI教程

在 JNIDemo.java-JNIDemo.h-JNIDemo.cpp 文件都有了后 可以开始生成so库,生成so库的时候需要注意 JNIDemo.h、JNIDemo.cpp都需要在上面说的jni文件夹中

并且jni文件夹中还需要增加Android.mk、Application.mk 作为初学者开始连mk文件怎么创建都有些懵 不知道的可以瞧一眼右键New->File->Android.mk 就可以了

生成so库前,需要早gradle.properties:中添加

android.useDeprecateNdk=true

Andorid 生成NDK动态链接库 .so库

 

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)      

LOCAL_MODULE := TestJNI
LOCAL_C_INCLUDES := JNIDemo.h
LOCAL_SRC_FILES := JNIDemo.cpp

include $(BUILD_SHARED_LIBRARY)

上面必须保证语法还有文件名 引用的模块正确  不然会出错

LOCAL_PATH:源文件路径,宏my-dir由Build System提供,返回包含Android.mk的目录路径
每个Android.mk文件必须以定义LOCAL_PATH为开始,用于开发tree中查找源文件
include $(CLEAR_VARS): 可以参考官方指南~ ~ ~ ~
LOCAL_MODULE:要载入的模块库,与System.loadLibrary("TestJNI")中的参数保持一致
LOCAL_SRC_FILES:要编译的源文件
LOCAL_C_INCLUDES: 要引用的文件


Application.mk:
  
APP_PLATFORM := android-14
APP_PLATFORM 最低支持版本 这个需要与App的minSdkVersion相对应

到这里基本上没问题了,我们可以选中JNIDemo.cpp文件右键External Tools dnk-build生成库,如果成功的话会生成libs、obj文件夹

Andorid 生成NDK动态链接库 .so库


到这里生成.so库 大概就是这样,后面还有很多坑,继续入坑~ ~ ~