android studio里的ndk toolchains问题,请问怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android studio里的ndk toolchains问题,请问怎么解决相关的知识,希望对你有一定的参考价值。

android studio ndk调用过程如下:
通过jniaes案例说明调用NDK层配置过程
而我们通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。
首先去官网下载一个最新的NDK,随便放到哪都行,像我放在D:\\Dev\\Android\\android-ndk-r10d.
(1) 新建一个项目:名称JniAes
首先在java类中添加native接口,注意写好native接口和System.loadLibrary()即可。代码如下:
1 public synchronized static native String getFromNativeIv();
2 public synchronized static native String getStringFromNative();
3 public synchronized static native int jniCheckAPP(Context context);
4

然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:
aes\\app\\build\\intermediates\\classes\\debug\\android\\

(2)接下来跟class文件生成相应的.h头文件,执行如下命令即可
点击"View->Tool Windows->Terminal" 即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件.
javah -d jni -classpath c:\\Users\\sodinochen\\AppData\\Local\\Android\\sdk\\platforms
\\android-16\\android.jar;..\\..\\build\\intermediates\\classes\\debug com.aes.jniaes.MainActivity
(3)然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫strk.c 。
strk.c文件,用于实现核心代码逻辑,判断包名.哈希值是否合法,如果返回1,为合法。反之,则不合法。入口方法为:
jint Java_com_aes_jniaes_MainActivity_jniCheckAPP(JNIEnv* env, jobject context,
jobject thiz)
接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:
sdk.dir=D\\:\\\\Dev\\\\Android\\\\android-sdk-windows
ndk.dir=D\\:\\\\Dev\\\\Android\\\\android-ndk-r10d

(4)接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

defaultConfig
applicationId "com.aes.jniaes"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"

ndk
moduleName "checkapp-jni" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。



(5)最后就是添加静态初始化loadLibrary代码,添加如下:
static
System.loadLibrary("checkapp-jni"); //so文件的名字


编译出来的so文件在aes\\app\\build\\intermediates\\ndk\\debug\\lib目录下
那么如何将编译好的so文件进行使用,可以通过如下方式:
二 . 引用so文件
(1).在“src/main”目录中新建名为“jniLibs”的目录;
(2).将so文件复制、粘贴到“jniLibs”目录内。
参考技术A 换成android-ndk-r9d以上版本就可以解决了,你可以试试看。本回答被提问者采纳

android studio ndk开发总结

1、path环境变量

2、android studio关联ndk

     local.properties   ndk.dir

     gradle.properties  android.useDeprecatedNdk=true//兼容老版本

3、build.gradle 配置 

    defaultConfig{

    ndk{

        moduleName "Hello"

        abiFilters ‘‘armeabi","armeabi-v7a","x86"

                    }

}

4、根据上层java 的native 函数,可自动生成 对应的头文件

   控台执行:javah -calsspath . 路径文件

5、使用android_log_print需要再编译配置中加入log库

如果你用的是正式版gradle,在ndk标签中加入 

ldLibs "log" 
如果你用的是实验版gradle,在ndk标签中加入: 

ldLibs.add("log") 
如果你使用CMakeLists,在target_link_libraries标签中加入log
如果你使用的是MK文件,加入如下语句: 

LOCAL_LDLIBS := -llog 
//打印一个简单Info级别的日志 对应Java的Log.i("JNI","This is log")

__android_log_print(ANDROID_LOG_INFO,"JNI","This is log"); 

//打印格式化字符串 这里使用的是C语言中printf中的格式。关于C中的printf格式化输出可自行百度,文档非常多。

int i=5;
__android_log_print(ANDROID_LOG_INFO,"JNI","i=%d",i); 

 

以上是关于android studio里的ndk toolchains问题,请问怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段

Android Studio 中的 NDK 集成

Android Studio NDK初探

android studio2.2 配置NDK

Android Studio Ndk 编程

Android Studio 之 NDK篇