1、新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。
2、打开android studio终端,使用javac编译上述文件,生成class文件。
D:\GitDownload\LocalServer_so\app\src\main\java\com\union\webserver\encrypt>javac AES.java
3、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件
一定要在上一级哦,不然不会报错:找不到xxx类
比如我的AES.class在
D:\GitDownload\LocalServer_so\app\src\main\java\com\union\webserver\encrypt>
我的包名是:
package com.union.webserver.encrypt
所以我的javah命令应该这么写:
D:\GitDownload\LocalServer_so\app\src\main\java>javah -jni com.union.webserver.encrypt.AES
然后就能看到生成了一个h文件。
4、新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。
生成的h文件
拷贝修改后的main.c
#include "com_union_webserver_encrypt_AES.h" char* aes_key[] = { "a6f80f0fb1c50889", "e223c05acc24be1d", "c2ecf58135077acc", "9fe907118cece5bf", "0c3c3ed5cff7bd96", "5eae4f136da0c80e", "d741848179f9904e", "0c606bd30a453198", "3e0ccc681e60d0fb", "4540064fea80bb54", "1c9f7606a8f57cd2", "8d5cd862fb0f8a7a", "f549147c1cfb46d8", "64daaeb0dcabce7d", "2baf2156dcc2a0bc", "864396c5ebfa495a", "c981f6bbf7f4a088", "677686548fab55e4", "130cb717a74fd032", "68eab7ecf1b4a3d1", "b35011f7a87e9f7a", "cf524cfdefea7260", "d9835d24e9cb4494", "3a016fa6d3622f19", "3ce273906ebe65cd", "adffbc605dacf944", "16349e4c587aceb5", "3faa70986eaae7a0", "9c6a6d31ede44e22", "4bf0dadade70a385", "ce3514b356d9f650", "4962065970030262" }; /* * Class: com_union_webserver_encrypt_AES * Method: getPSW * Signature: (I)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_union_webserver_encrypt_AES_getPSW(JNIEnv *env, jclass cl, jint i) { int aes_index = i; return (*env)->NewStringUTF(env, aes_key[aes_index]); } /* * Class: com_union_webserver_encrypt_AES * Method: getVersion * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_union_webserver_encrypt_AES_getVersion(JNIEnv *env, jclass cl) { return (*env)->NewStringUTF(env, "1"); }
5、配置NDK
打开Project的local.properties文件添加NDK路径
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
ndk { moduleName "unionaes_v1.0" abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a' }
还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
6、生成SO库
完成以上步骤之后,我们rebuild一下就可以生成so库了
在项目的app\build\intermediates\ndk\debug\lib路径下
7、配置so库
在src\main下新建文件夹jniLibs,并将生成的SO文件拷贝到该文件夹下