JNI NDK开发笔记

目录

    • 目录
    • github源码地址
    • 下面是干货
    • Cmake模式
    • 传统NDK-Build模式
    • 基于openssl实现的3DESAESMD5RSA加解密

github源码地址:

详细请见源码: 下载地址

源码包含了: JNI静态注册,动态注册,以及基于openssl实现的3DES、AES、MD5、RSA加解密实现

下面是干货:

Cmake模式:

谷歌从AndroidStudio2.2以上就添加了Cmake方式来编译NDK代码,并从NDK例子看出,默认编译的方式就是cmake方式。

首先需要下载相关工具支持,使用SDK Manager即可:
JNI NDK开发笔记_第1张图片

使用方式:新建项目时勾选这个选项:
JNI NDK开发笔记_第2张图片

项目结构:
JNI NDK开发笔记_第3张图片

gradle配置:
JNI NDK开发笔记_第4张图片

java代码:

package com.jnitest.luyanhao.jni_study;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    // Example of a call to a native method
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }
}

C++代码:native-lib.cpp 它使用的是静态注册的方式,动态注册的方式代码同传统JNI。

#include 
#include 

extern "C"
jstring
Java_com_jnitest_luyanhao_jni_1study_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

传统NDK-Build模式

studio提供了强大的插件功能External Tools,我们使用它配置两个非常有用的插件:
进入Settings–>Tools–>ExternalTools,点击+号增加。
JNI NDK开发笔记_第5张图片

javah -jni插件配置:
JNI NDK开发笔记_第6张图片

javah -jni命令,是根据java文件生成.h头文件的,会自动根据java文件中的类名(包含包名)与方法名生成对应的C/C++里面的方法名。下面是参数配置及其含义:
1. Program: $JDKPath$\bin\javah.exe 这里配置的是JDK目录下的javah.exe的路径。
2. Parametes: -classpath . -jni -d $ModuleFileDir$/src/main/jni $FileClass$ 这里$FileClass$指的是要执行操作的类名(即我们操作的文件),$ModuleFileDir$/src/main/jni表示生成的文件保存在这个module目录的src/main/jni目录下。
3. Working: $ModuleFileDir$\src\main\java module目录下的src\main\java目录(不是很理解)。

使用方式:选中java文件—>右键—>External Tools—>javah-jni,将生成jni文件夹以及文件夹下的 包名.类名的.h头文件 (名字过长,我们可以自己重命名)。

ndk-build插件配置:
JNI NDK开发笔记_第7张图片

ndk -build命令,是根据C/C++文件生成so文件的。下面是参数配置及其含义:
1. Program: E:\work\Android\Sdk\ndk-bundle\build\ndk-build.cmd 这里配置的是ndk下的ndk-build.cmd的路径(根据实际情况填写)。
2. Working: $ModuleFileDir$\src\main\

使用方式:选中C/C++文件—>右键—>ExternalTools—>ndk-build,将在main文件夹下生成libs文件夹以及多个so文件,我们可以移动至jniLibs目录下去。

项目目录结构:
JNI NDK开发笔记_第8张图片

基于openssl实现的3DES、AES、MD5、RSA加解密

目录结构:
JNI NDK开发笔记_第9张图片

CMakeLists.txt


cmake_minimum_required(VERSION 3.4.1)


include_directories(
    src/main/cpp/openssllib/include/openssl/
    )

link_directories(
    src/main/cpp/openssllib/
    )


add_library(
    native

    SHARED

    src/main/cpp/MyRSA.cpp
    src/main/cpp/MyBASE64.cpp
    src/main/cpp/My3DES.cpp
    src/main/cpp/MyMD5.cpp
    src/main/cpp/MyAES.cpp
    src/main/cpp/native-lib.cpp
    )

find_library(
    log-lib
    log
    android
    )

target_link_libraries(
    native
    libcrypto.a
    libssl.a
    android
    ${log-lib}
    ) # 链接动态库

你可能感兴趣的:(ndk_jni_C/C++)