当前位置:   article > 正文

android studio 编译jni程序_android studio jni编译

android studio jni编译
  1. 什么是NDK?
    NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

  2. 为什么使用NDK?
    1.)代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
    2.)可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
    3.)提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
    4.)便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

  3. 什么是JNI?
    JNI全称为:Java Native Interface。JNI是本地编程接口,它使得在 Java 虚拟机内部运行的 Java代码能够与用其它语言(如 C、C++)编写的代码进行交互。

  4. 为什么使用JNI?
    JNI的目的是使java方法能够调用c实现的一些函数。

  5. 安卓中的so文件是什么?
    Android中用到的so文件是一个c++的函数库。在android的JNI中,要先将相应的C语言打包成so库,然后导入到lib文件夹中供java调用。
    开始:
    1.通过SDK Manager安装NDK,并配置ndk-bunlde的环境变量(验证:Cmd窗口输入ndk-build),并在Android Studio的Project Structrue里面检查NDK location是否正确。

2.添加配置NDK相关的External Tool:

(1)添加配置ndk-build,用于生成so文件

如图两个必填设置项:一个为NDK的build.cmd路径,另一个为工作代码路径
在这里插入图片描述
(2)添加配置javah,用于生成Jni的头文件

如图两个必填设置项:一个为JDK的javah.exe路径,另一个为工作代码路径

参数:Program: J D K P a t h JDKPath JDKPath\bin\javah.exe

        Arguments: -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$

        Working directory:$ModuleFileDir$\src\main\Java
  • 1
  • 2
  • 3

在这里插入图片描述
3.Jni开发

(1)准备一个项目,在main下面新建Jni文件夹,如图:

      勾选change folder location
  • 1

在这里插入图片描述
会在app下的build.gradle文件中自动加入sourceSets,将其修改为:

sourceSets.main {
jniLibs.srcDir ‘src/main/libs’
jni.srcDirs = [] //disable automatic ndk-build call
}
(2)检查gradle.properties文件夹下是否有以下代码,没有加上

android.useDeprecatedNdk=true

      检查local.properties中是否加入ndk和sdk路径没有加上
  • 1

ndk.dir=F:\Studio\sdk_studio\ndk-bundle
sdk.dir=F:\Studio\sdk_studio
在app文件夹下的build.gradle中的defaultConfig里加入如下代码

ndk{

moduleName"hello"       //生成的so文件名字,调用C程序的代码中会用到该名字
abiFilters 'armeabi-v7a' //, 'armeabi','x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
  • 1
  • 2

}
在这里插入图片描述
(3)在jni文件夹下新建Android.mk,内容:

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello
LOCAL_SRC_FILES :=hello.c
include $(BUILD_SHARED_LIBRARY)
在jni文件夹下新建Application.mk,内容:

APP_MODULES := hello
APP_ABI := armeabi-v7a
在这里插入图片描述
(4)在指定路径下新建一个Java用于加载本地库,这个路径会在so文件的头文件里面使用,也就是说在其他apk里面使用此so文件也只能通过这个路径加载。
在这里插入图片描述
在NativeCaller.class右键选择External tools,javah运行,会在jni文件夹下自动生成“包名+类名”的.h文件,然后在jni目录新建hello.c文件引入刚才生成的头文件,并实现头文件中声明的方法:

#include “com_qian_NativeCaller.h”
JNIEXPORT jstring JNICALL Java_com_qian_NativeCaller_getStringFromNative(JNIEnv *env, jobject obj){//方法名是Java_包名_类名_方法名
char *str = “String from native C”;
return (*env)->NewStringUTF(env, str);
}
注意,如果上述方法不好用,可以 cd到E:\shijue\JniHello\app\src\main\java目录下,直接javah -d jni com.example.machnike_pc.jnihello.MainActivity 即可,这时如果提示“无法确定SurfaceHolder的签名 ” 具体操作如下:
javah -classpath 你的Android SDK路径/sdk/platforms/版本(比如:android-25)/android.jar;. 要编译的文件全类名

在这里插入图片描述
(5)编译c文件,生成so文件:右键jni文件,选择External Tools —> ndk-build,运行即会在libs下面生成so文件。这里我自己已经把生成的so文件移动到JniLibs下面了。
在这里插入图片描述
git地址:

https://github.com/zhuslon/JniHello.git
感谢原文博主:
原文链接:https://blog.csdn.net/zxl1173558248/article/details/81701967

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/335151
推荐阅读
相关标签
  

闽ICP备14008679号