一.移动安全之so文件调试:使用Android Studio生成so文件并调用

    科技2022-09-07  127

    一.移动安全之so文件调试:使用Android Studio生成so文件并调用

    1.新建Android Studio项目,并新建JniTest类

    JniTest.java

    package com.sy.sohelloworld; public class JniTest { static { System.loadLibrary("JniTest"); } public native static String getString(); }

    之后make project,在app/build目录下会生成.class文件。

    2. 在app/src/main文件夹下新建jni文件夹,在Android Studio的终端进入该目录下,执行以下命令,会在当前目录生成com_sy_sohelloworld_JniTest.h文件:

    javah -jni -classpath D:\AndroidHome\workspace\SoHelloWorld\app\build\intermediates\javac\debug\classes com.sy.sohelloworld.JniTest

    3.在jni目录下新建test.c文件,并且实现之前.h文件中的方法。

    #include "jni.h" #include "com_sy_sohelloworld_JniTest.h" JNIEXPORT jstring JNICALL Java_com_sy_sohelloworld_JniTest_getString (JNIEnv *env, jclass jz){ return (*env)->NewStringUTF(env,"flag is {21232f297a57a5a743894a0e4a801fc3}"); }

    4. 利用ndk-build命令来生成.so文件,必须有Android.mk文件和Android.mk文件,并且与对应的.cpp/.c文件在同一个目录下。

    Android.mk文件用于向构建系统描述源文件和共享库,用于定义 Application.mk、构建系统和环境变量所未定义的项目范围设置。Application.mk 文件实际上是定义要编译的多个变量的微小 GNU Makefile 片段。

    (1)在jni目录下新建Android.mk文件

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniTest LOCAL_SRC_FILES := Test.c include $(BUILD_SHARED_LIBRARY)

    (2)在jni目录下新建Application.mk文件

    APP_ABI := all

    (3)关联下载好的ndk包

    (4)将ndk-build添加到环境变量中,之后cmd进入到jni目录下,执行命令ndk-build,成功生成so文件。

    5.调用so文件

    (1)在app/build.gradle文件添加如下配置:

    sourceSets { main() { jniLibs.srcDirs = ['src/main/libs'] jni.srcDirs = [] //屏蔽默认的jni编译生成过程 } }

    (2)在layout/activity_main.xml文件添加如下代码:

    android:id="@+id/textView"

    (3)在MainActivity中调用

    package com.sy.sohelloworld; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); textView.setText(JniTest.getString()); } }

    6.编译运行,如下所示:

     

     

    Processed: 0.009, SQL: 10