android 单步调试jni,使用Android studio开发jni,并实现单步调试c/c++代码

一 环境搭建

本文讲解的是在一个现有的工程中增加JNI的支持。

我们从新建一个工程说起,本文假设你已经知道怎么设置sdk和ndk。

416a415b4baa900cf3b3e51ed583ae98.png

新建工程的时候我们故意不勾选这个选项,方便后面说明。

0b70eb1f508f91eca191c793e9d7e678.png

一直默认点下一步,直到工程创建完成。

工程创建完成之后是这样的

28014ca43a5b3a72bd8df755d14bb4f4.png

打开SDK manager注意这两个包要下载下来

7f27758d978773e7c45a99b68074394e.png

然后新建一个jni目录,如下图

4ecef20ca6274b5cf66a12edc9396193.png

好好看,这个jni文件夹的颜色和java的颜色不一样

a68c2733c78a4e7ee7550cee7736bddf.png

二 声明本地方法

我这里在java层声明了三个本地方法,并在java代码中调用他们。

public class MainActivity extends AppCompatActivity {

static {

System.loadLibrary("hello");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView tv = (TextView) findViewById(R.id.textView);

String strFormJni = StartJni();

tv.setText(strFormJni);

}

public native String StartJni();

public native void EndJni();

public native void JniProcess();

}

三 新建jni目录

在jni目录下新建三个文件Android.mk Application.mk hello.cpp

Android.mk

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE :=hello

LOCAL_SRC_FILES :=hello.cpp

include $(BUILD_SHARED_LIBRARY)

Application.mk

APP_MODULES := hello

APP_PLATFORM := android-28

NDK_LIBS_OUT=src/main/jniLibs

APP_ABI := all

APP_OPIM :=debug

hello.cpp

在cpp文件中实现MainActivity.java中声明的三个本地方法。这里采用的是动态注册的方法。

#include #include extern "C"{

//JNIEXPORT : 导出函数符号表

JNIEXPORT jstring native_init(JNIEnv* env, jobject obj);

JNIEXPORT void native_exit(JNIEnv* env, jobject obj);

JNIEXPORT void native_process(JNIEnv* env, jobject obj);

}

jstring native_init(JNIEnv* env, jobject obj)

{

// LOGI("native init is called");

int m;

m += 10;

return env->NewStringUTF((const char *)"hello form JNI22");

}

void native_exit(JNIEnv* env, jobject obj)

{

// LOGI("native init is called");

}

void native_process(JNIEnv* env, jobject obj)

{

//LOGI("native init is called");

}

static JNINativeMethod gMethods[] =

{

{ "StartJni", "()Ljava/lang/String;", (void*) native_init},

{ "EndJni", "()V", (void*) native_exit},

{"JniProcess","()V",(void*)native_process}

};

jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)

{

JNIEnv* env = NULL;

if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)

return JNI_ERR;

//com/example/app/NativeInterface,在这个java类中声明了本地方法,所以这里写这个方法的全路径

jclass clazz = env->FindClass("com/example/cbj_g/debugjni/MainActivity");

//注册,本地方法到VM的表中

env->RegisterNatives(clazz, gMethods,

sizeof(gMethods) / sizeof(gMethods[0]));

return JNI_VERSION_1_4;

}

/* 卸载JNI库 */

void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved)

{

//__android_log_write(ANDROID_LOG_DEBUG, "DiagMain","JNI_OnUnload");

}

四 转换工程配置

这一步是关键,右键main文件夹,选择Link C++ Project with Gradle,我们这里选择使用ndk-build的方式,project Path处选择jni目录下的Android.mk

9acbf9fc03cedf27a48a1d60bea81198.png

经过上述操作之后你就发现jni目录和java目录的颜色变成一样的了。至此我们的环境都设置好了,接下来就可以愉快的debug了。

fa08fae9db5e93b9d6e81b289607af94.png

五 debug截图

jni的环境初始化函数

5713eb0528fa4b8173e71b8a1ba382ad.png

java调用CPP函数

54db2b75663f8fd2f9376fece68e7cb6.png

java层得到返回值

5971d7e2dcb6ca5c25aefad9ce1a7262.png

源码下载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android Studio中编写C/C++代码,你需要进行以下步骤: 1. 创建一个新的Android Studio项目。 2. 在你的项目中创建一个新的C/C++源文件。你可以使用菜单File->New->C/C++ Source File来创建源文件。 3. 在你的源文件中编写C/C++代码。 4. 在你的项目中创建一个新的JNI头文件。你可以使用菜单File->New->JNI/C++ Header File来创建头文件。 5. 在你的JNI头文件中声明你的C/C++函数和变量。例如,如果你的C/C++源文件中有一个函数叫做myFunction,你可以在你的JNI头文件中这样声明它: ```c++ JNIEXPORT void JNICALL Java_com_example_myapp_MyClass_myFunction(JNIEnv *env, jobject obj); ``` 请注意,这里的Java_com_example_myapp_MyClass_myFunction是根据你的Java类和函数名称来自动生成的。你需要根据你的实际项目进行修改。 6. 在你的Java代码中,使用JNI接口调用你的C/C++函数。例如,如果你的Java类是MyClass,你可以在它的某个方法中这样调用你的C/C++函数: ```java public void myMethod() { myFunction(); } ``` 7. 在你的项目中配置NDK环境。你需要下载NDK并在你的项目中配置NDK路径。你可以使用菜单File->Project Structure->SDK Location来配置NDK路径。 8. 在你的项目中配置CMake。你需要创建一个CMakeLists.txt文件来告诉Android Studio如何编译你的C/C++代码。你可以使用以下模板来创建CMakeLists.txt文件: ``` cmake_minimum_required(VERSION 3.10.2) project(myproject C CXX) add_library(mylib SHARED mysource.cpp) target_link_libraries(mylib log) ``` 请注意,这里的mysource.cpp和mylib是根据你的实际项目进行修改。 9. 运行你的项目并测试你的C/C++代码。 请注意,以上步骤只是一个基本的示例,你需要根据你的实际项目需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值