目录
github源码地址:
详细请见源码: 下载地址
源码包含了: JNI静态注册,动态注册,以及基于openssl实现的3DES、AES、MD5、RSA加解密实现
下面是干货:
Cmake模式:
谷歌从AndroidStudio2.2以上就添加了Cmake方式来编译NDK代码,并从NDK例子看出,默认编译的方式就是cmake方式。
首先需要下载相关工具支持,使用SDK Manager即可:
使用方式:新建项目时勾选这个选项:
项目结构:
gradle配置:
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 <jni.h>
#include <string>
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,点击+号增加。
javah -jni插件配置:
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插件配置:
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目录下去。
项目目录结构:
基于openssl实现的3DES、AES、MD5、RSA加解密
目录结构:
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}
) # 链接动态库