android JNI开发初探

借鉴博客(https://www.cnblogs.com/rocomp/p/4892866.html)

JNI 概念

JNI(java native interface:java) 本地开发接口
JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(c/c++),外部的c/c++也可以调用java代码
优势
代码效率上c/c++是本地语言,比Java更高效
代码移植:c语言模块可以复用
代码安全:相对c语言java更容易被反编译,一般加密算法都是用C语言编写,不容易被反编译
引用类型对应
jobject 				(all java objects)
|
|-jclass     			(java.lang.Class objects)
|-jstring 				(java.lang.String objects)
|-jarray				(arrays)
|       |-jobjectArray  (object arrays)
|		|-jbooleanArray (boolean arrays)
|		|-jbyteArray    (byte arrays)
|		|-jchrArray 	(char arrays)
|		|-jshortArray	(short arrays)
|		|-jintArray		(int arrays)
|		|-jlongArray	(long arrays)
|		|-jfloatArray	(float arrays)
|		|-jdoubleArray	(double arrays)
|-jthrowable			(java.long.Throwable.object)
堆内存和栈内存
栈内存:系统自动分配和释放,保存全局、静态、局部变量,在栈上分配的内存叫做惊天分配,大小一般是固定的.
堆内存:程序员手动分配(malloc/new)和释放(free/java不用手动释放,由GC回收),在堆上分配的内存叫做动态分配,一般硬件内存有多大堆内存就有多大.

交叉编译的概念

1、交叉编译的概念
	在一个平台编译出另一个平台能执行的二进制代码
	主流平台又:windows、 mac os、 Linux
	主流处理器:x86、 arm、 mips
2、交叉编译原理
在一个平台上,模拟其他平台的特性
便以流程:源代码-->编译-->链接-->可执行程序
3、交叉编译工具链接
多个工具的集合,一个工具使用完后接着调用下一个工具
4、交叉编译编译工具
NDK(Native Development kit)开发必备工具,模拟其他平台特性类编译代码的工具
CDT(C/C++ Development Tools)是Eclipse开发C语言的一个插件,高亮显示C语言的语法
Cygwin: 一个Windows平台的Unix模拟器

可以参考这篇博客Cygwin简介及使用

环境配置 ndk

cmakelists.txt 文件配置


	cmake_minimum_required(VERSION 3.4.1)
#设置生成的so动态库最后输出的路径 配置
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
        native-lib
        # Sets the library as a shared library.
        SHARED
        # Provides a relative path to your source file(s).
        src/main/cpp/native-lib.cpp)

#添加第二个
add_library(test-lib src/main/cpp/test-lib.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
        log-lib
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries(native-lib ${log-lib})
target_link_libraries(test-lib ${log-lib})

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY P R O J E C T S O U R C E D I R / . . / j n i L i b s / {PROJECT_SOURCE_DIR}/../jniLibs/ PROJECTSOURCEDIR/../jniLibs/{ANDROID_ABI})
cpp文件中新建.cpp文件需要使用:"文件名"±lib


	ndk{
            moduleName "native-lib"//so文件自动生成lib+ moduleName +.so
            abiFilters "arm64-v8a","armeabi-v7a","x86","x86_64"//cup的类型
            
        }
配置多个cpp文件生成so文件
https://blog.csdn.net/qq13244843816/article/details/80783409

JNIdemo

开发环境mac androidstudio 3.0
新建一个android工程 

引用os文件

常用方法 目录 app/build/intermediates/cmake/debug/obj/
copy所有so文件
如果有修改,可以删掉重新make object


在main同目录下新建jniLibs文件夹 复制os文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值