From:Android Studio 3.0 JNI 的实现:https://blog.csdn.net/ziyoutiankoong/article/details/79696279

Android Studio 生成so包和.H文件给jni调用产生新so包。(即so包调so包):https://blog.csdn.net/sxh_android/article/details/80694291

Android Studio 3.0 SO文件的引用:https://blog.csdn.net/ziyoutiankoong/article/details/79700879

android studio 3.0 JNI 使用:https://www.jianshu.com/p/190a242fd7ab

Android Studio jni开发入门——看我就够了!:https://www.jianshu.com/p/28d541d658db

Android Studio开发之 JNI 篇:https://www.jianshu.com/p/c993928e8081

android studio 3.4 配置 Android -jni 开发基础的教程详解:https://www.jb51.net/article/169438.htm

基于Android studio3.6 的JNI教程之helloworld思路详解:https://www.jb51.net/article/182804.htm

Android Studio 开发 JNI 示例:https://blog.csdn.net/wzhseu/article/details/79683045

JNI 技术的整体步骤和原理:

1、新建一个Android studio工程(注意  把这个勾选上,不然后面还需要配置,勾选上就无须自己配置Cmake,Gradle啦)

2、Android 指定位置新建一个类,如JavaJNI.java类(一般位置为、src/main/java/"你的包名"/),在该类里面声明一个方法,该方法有本地端实现,即如 public native void open();

3、写好之后本地native方法之后,配置Javah, 操作步骤:File-Tools-External Tools-"点击加号"    name随便起一个,方便统一叫javah, 下面的Description可以和上面一致;

Program: $JDKPath$\bin\javah.exeAuguments: -classpath . -jni -o $ModuleFileDir$/src/main/jni/$Prompt$ $FileClass$Working directory: $ModuleFileDir$\src\main\java

以上为配置Javah过程,到这就配置好了,注意上面几个配置你可以理解为固定配置,其实是一些路径定义,可以不用管的,

4、鼠标选中刚刚新建的含有本地实现方法的类,右击选择External Tools的Javah, 随机在弹出的窗口输入名字(这个名字就是马上生成的C或C++头文件的名字,文件会保存在/src/main/jni/下面),这样我们的C或C++头文件就生成好了,在JNI文件下,

5、将生成的.h头文件 放到、src/main/cpp文件中

6、在cpp文件下在新建一个对应的.cpp文件,开始编写需要调用的本地函数方法(具体做法把刚生成.h文件中的方法名复制过来,“;”改为方法体“{}”,然后在方法体中用C++实现你需要的功能)

7、在MainActivity.java测试类中调用JavaJNI.java类中本地声明的方法

8、编译即可成功调用实现你写的C++方法

1. NDK 安装配置

在 File - Settings ...,下查看 NDK 安装配置情况,如果没有下载配置 NDK ,以及相关的包,对应下载相关的安装包。

具体如下图

打开 sdkManager下载 CMake 和 LLDB

配置 ndk

下载安装好后,可以在 File - Project Structure 的 SDK Location 下查看对应的安装配置路径情况,

2. 打开 Android Studio,新建一个 Native C++工程。

具体如下图

输入工程名:JNINDK

然后,点击 完成:

成功创建 Android 项目 (JNIDemo)

如图:

创建 jni 文件夹:src 右键 ---> New ---> Folder ---> JNI Folder 如图:

选择 JNI Folder :

结果如图:

3. 创建 JNI 类

示例代码:

public class JNITest {static {System.loadLibrary("JniLib");}public native String getString();}

如图:

3.1  生成 .h 文件

方法 1:

配置 Anroid Studio 外部工具,一劳永逸,往后无需命令行,File ---> Setting ---> Tools ---> External Tools ---> “+” 进入页面

添加外部命令:

配置命令:

Program:$JDKPath$\bin\javah.exeParameters:-classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$Working directory:$ModuleFileDir$\src\main\Java注释:-classpath classes 指明类所在的位置-jni com.jni.jnitest.JNITest 类的绝对路径-d 产生的.h文件放到指定目录下;

配置成功如图:

开始生成 .h文件,选中 JNI类 右键 ---> New ---> External Tools ---> javah,如图:

成功后如图:

方法 二

右键拖动JNI类所在的包的路径到Terminal,自动切换到该目录下

javac 编译生成 class 文件( 生成class文件的方法有很多,这里提供一种)

右键拖动 java 文件夹到 Terminal,自动切换到该目录下

必须在包名外使用 javah 命令,编译生成.h文件,把.h文件移动到jni文件夹(生成.h文件后可以删除class文件)如图:

示例命令:javah -d jni -classpath ./java com.example.myapplication.hello

3.2  创建文件 JniLib.cpp 、Android.mk、Application.mk

在 jni 目录下分别创建并编写 JniLib.cpp、Android.mk、Application.mk 这三个文件

复制.h文件内容到 JniLib.cpp 并修改,如下(此文件为JNI内容文件):

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <com_jni_jnitest_JNITest.h>
/* Header for class com_jni_jnitest_JNITest *//** Class:     com_jni_jnitest_JNITest* Method:    getString* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_jni_jnitest_JNITest_getString(JNIEnv * env, jobject jobject){return (*env).NewStringUTF("成功调用JNI内容");}

Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := JniLib
LOCAL_SRC_FILES =: JniLib.cpp
include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_MODULES := JniLib
APP_ABI := all

4.  其它相关配置

4.1 修改 app下的 build.gradle 文件, 如下图

示例代码:

ndk{moduleName "JniLib"
//            abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定的三种abi体系下的so库}sourceSets.main{jni.srcDirs = []jniLibs.srcDir "src/main/libs"}

4.2 项目下的gradle.properties文件(如果没有此文件,自己新建一个)添加代码:

android.useDeprecatedNdk=true

5.  执行 ndk-build

此处我用的是配置好的工具来执行,和  javah  外部工具 一样的步骤

选中JNI类右键->New->External Tools->ndk-build,结果如图:

6.  调用 so

示例代码:

package com.jni.jnitest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {Button button;TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = findViewById(R.id.button);tv = findViewById(R.id.tv);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {tv.setText("结果:"+ new JNITest().getString());}});}
}

结果

demo 下载:https://download.csdn.net/download/u013015029/10309365

安卓逆向_15( 二 ) --- Android Studio 3.6.3 JNI 环境配置 和 so 生成开发 demo相关推荐

  1. android小游戏编程视频下载,【安卓游戏】使用 Android Studio 打包 RPG Maker MV 制作的游戏,生成 apk 安装包...

    RPG Maker MV 是一个简单易用的游戏制作软件,即使不会编程也能做出一个有模有样的游戏.但是它只能生成基于 Html5 的游戏文件,而不能直接生成安卓手机需要的 apk 文件,所以我们要自己想 ...

  2. Android Studio动态调试smail代码----环境配置

    一.android studio smalidea plugin不能使用 smali语言调试网上都在推荐smalidea这个插件,但是在新版的Android studio 中好像已经不支持了(第一次安 ...

  3. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  4. 【安卓大作业】Android Studio学校图书管理系统

    [安卓大作业]Android Studio学校图书管理系统 一.界面展示 二.功能介绍 图书馆介绍.查看上架新书.借阅排行榜 学生端.图书借阅.管理员端.图书管理等 三.项目结构 四.关键代码展示 ( ...

  5. Android Studio下项目构建的Gradle配置及打包应用变体

    Gradle简介   Gradle是一个自动化构建工具,采用Groovy的Domain Specific Language(领域特定语言)来描述和控制构建逻辑.具有语法简洁.可读性强.配置灵活等特点. ...

  6. 配置Android Studio内置jre的环境变量

    下载Android Studio时,包括jre.将这个jre配置过环境变量后,就可以在全局使用了.但是和官网安装jre的环境配置略有不同. 图一  jre官网下载,安装后的目录 图二  Android ...

  7. Android studio 使用Cmake完成C/C++ 的使用以及生成so文件

    今天,简单讲讲android中关于Cmake进行NDK编程的相关知识. Android studio 2.2版本以后对C/C++的支持可以说很方便了,当然官方推荐使用Cmake完成对C/C++的支持 ...

  8. 生成jni的android.mk,Android Studio 3.5版本JNI生成SO文件详解

    学习在于记录,把自己不懂得容易忘记得记录下,才是最好得选择. 废话不多说,想要在Android开发中嵌入c/c++代码,直接开始如下步骤 1.创建需要调用的Java类 在你某个指定的包下创建如下类pa ...

  9. Android逆向笔记-使用Android Studio调试Smali代码(方式二)

    这里我使用Android Studio写了这样的一个程序: 这里我使用Android Studio写了这样的一个程序: 然后点下BUTTON后: 下面写下如何调试这种程序. 开发环境: win 10: ...

最新文章

  1. element-ui button组件 radio组件源码分析整理笔记(一)
  2. Unity User Group深圳站——Timeline Cinemachine分享
  3. 2_4 FacadeMode.cpp 外观模式
  4. mysqld进程 ut_delay 占用率过高
  5. JavaScript返回上一页代码区别
  6. A-Graph Games_2019牛客暑期多校训练营(第三场)
  7. 【旧文章搬运】360安全卫士HookPort.sys完美逆向
  8. firefly 环境配置所需工具
  9. 2016-05-25 margin-right jsp获取页面流变量 文字颜色
  10. 2021-04-23 Perl语言入门 导学
  11. navicat 简体中文破解版
  12. 鼎捷ERP二维码整体解决方案——适应于制造业、物流行业(适用于用友ERP、金蝶ERP、SAP)
  13. 解决 Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足
  14. 解决Eth0网卡不存在的情况_wuli大世界_新浪博客
  15. 真的存在“对事不对人”吗?
  16. idea2018激活方式
  17. IT男着装bug修复,下一个业界男神就是你!
  18. mysql导入pet表
  19. 如何实现分库分表?怎么配置?
  20. 如何写SCI文章-转自知乎

热门文章

  1. DataMan-美团旅行数据质量监管平台实践
  2. 百度Java三面:现场面试39题目实拍含答案!
  3. 应用实践 | 电商应用——一种基于强化学习的特定规则学习模型
  4. python实现批量图片/文件重命名
  5. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI
  6. python引用自己的文件的一切问题
  7. 19-A Walk-based Model on Entity Graphs for Relation Extraction(句内多对,多关系,多元,2018ACL
  8. 介绍几个专门面向中文的命名实体识别和关系抽取工具
  9. jsp fmt标签详解
  10. 使用spring-data-mongodb操作mongodb