我最近开始使用Java Native Interface (JNI),遇到了一些问题,希望你能帮助我解决。
我使用的是 Android Studio 2.1.1、SDK 工具 25.1.7、NDK 12、API 21。
1.我的主要问题是我无法调试C代码,只能调试java。 我将尝试解释我对一个更简单的代码进行调试的尝试,我将包括其中。
1.1 我使用命令 ndk-build NDK_DEBUG=1 将 C 代码编译为 .so。
1.2 我已将 SDK\NDK 路径添加到 Android Studio 项目结构中。
1.3 我已在 build.gradle 中添加了“jnidebuggable=true”。
1.4 我在“运行”->“编辑配置”中创建了一个带有“Hybrid”的新调试 session 设置并将 .so 库加载到其中。
1.5 附加我的 Android.mk、Application.mk、build.gradle、C 代码和文件。
1.6 代码正在运行并工作,它没有到达 C 代码内的断点。
2.我如何监控代码的堆和堆栈使用情况,尤其是 JNI?还可以改变吗?
3.与2相同的问题。如何减少堆中的依赖性?将我的变量定义为静态可以解决问题吗?
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sub
LOCAL_SRC_FILES := subst.c
include $(BUILD_SHARED_LIBRARY)
应用程序.mk
APP_ABI := all
APP_BUILD_SCRIPT := C:\Users\Nir\AndroidStudioProjects\FirstApp\jni\Android.mk
C代码
jdouble Java_nir_firstapp_MainActivity_subst(JNIEnv* env, jobject obj, jdouble A, jdouble B)
{
int x;
x=A-B;
return(x);
}
构建.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "nir.firstapp"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
debuggable true
}
}
}
MainActivity相关代码
public native double subst(double A, double B);
static{
System.loadLibrary("sub");
}
double calc = subst(Double.valueOf(num1str),Double.valueOf(num2str));
真诚的感谢您, 尼尔
最佳答案
要启用 native 调试,请在 Android Studio 下编译 C++ 代码。
在 2.2 版本中,您可以使用 externalNativeBuild 。对于 2.1,您只有 experimental Gradle 插件。不幸的是,它没有完全集成到 AS 中,例如文件/项目结构(又名Ctrl-;)无法理解这些build.gradle
文件。
关于java - 无法启用 JNI 调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575440/