前言:
自己写APP时经常把url写在java代码中,特别容易被反编译出来,一直想怎么将它隐藏起来,由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大,所以,我选择学习点ndk基础知识,方便以后深入学习。
什么是NDK?
Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。(SDK Software Development Kit)
可以用来干什么?
NDK 不适用于大多数初学的 Android 编程者,对许多类型的 Android 应用没什么价值。 因为它不可避免地会增加开发过程的复杂性,所以通常不值得使用。 但如果您需要执行以下操作,它可能很有用:
· 从设备获取卓越性能以用于计算密集型应用,例如游戏或物理模拟。
· 重复使用您自己或其他开发者的 C 或 C++ 库。
· 由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大
怎么做?
这里,我用的是AS 2.3.3 。(网上方法很多,我觉得我只要会点基础就行了,只实现生成.so文件和在另外一个demo中调用这个so文件)
第一步:
新建工程,勾选include c++ support,然后一直下一步到完成,
这时候,我们发现,多了一些文件夹,我们只需要去了解这几个。
第一个,native.cpp是我们即将用到的文件,下面的CMakeLists.txt是配置文件,我们打开看下。
这时候我们打开native文件
我们需要得到的字符串就可以从这里输出。如:
改变这个就行
那么怎么写这个cpp文件呢?
如果和我一样只要学点皮毛,那么,恭喜你,As已经有快捷方式生成了
如:
我们新建一个class文件
写上如下的代码
将光标移到GetString上,alt+回车 直接生成c中的方法
JNIEXPORT jstring JNICALL
Java_com_example_auser_ndkdemo_NdkJni_GetString1(JNIEnv *env, jclass type) {
return env->NewStringUTF(returnValue);
}
改变 returnValue 的值就是我们需要的字符串了。
这里,我需要去得到so文件,其实,so文件已经生成了,我们去看看
这里,生成了各种版本的so文件,而且还有debug版和release版本,我们将其中的内容考出,导入到另外一个demo中去,如,导入到libs中
这里,我们需要去配置下grade
加入一行这个
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
然后去java中写入调用文件
这里得注意,这个调用文件的包名得和生成它的demo的包名一样
然后,里面的方法是一样的
这时候,我们只要直接调用这个方法即可
Demo下载地址:https://github.com/DioDevelooerCoder/ndk-demo.git