我最近开始使用Java Native Interface(JNI)并遇到了一些我希望你可以帮我解决的问题。
我使用的是Android Studio 2.1.1,SDK Tools 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我在Run-> Edit Config中创建了一个新的调试会话,使用" Hybrid" 设置并将.so库加载到它。
1.5附加我的Android.mk,Application.mk,build.gradle,C代码和文件。
1.6代码正在运行并且正在运行,它没有触及C代码中的断点。
2.我可以监视我的代码的堆和堆栈使用情况,尤其是 JNI?它也变了吗?
3.与2相同。我怎样才能减少堆中的依赖?将我的变量定义为静态做技巧吗?
Android.mk
APP_ABI := all
APP_BUILD_SCRIPT := C:\Users\Nir\AndroidStudioProjects\FirstApp\jni\Android.mk
Application.mk
jdouble Java_nir_firstapp_MainActivity_subst(JNIEnv* env, jobject obj, jdouble A, jdouble B)
{
int x;
x=A-B;
return(x);
}
C代码
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
}
}
}
的build.gradle
public native double subst(double A, double B);
static{
System.loadLibrary("sub");
}
double calc = subst(Double.valueOf(num1str),Double.valueOf(num2str));
MainActivity相关代码
view.setX(10)
view.setY(10)
view.setRotation(45)
view.measure(widthSpec, heightSpec)
我真诚地感谢你, 尼尔
答案 0 :(得分:0)
要启用本机调试,请在Android Studio下编译C ++代码。
使用2.2版,您可以使用externalNativeBuild。对于2.1,您只有experimental Gradle插件。不幸的是,它没有完全集成到AS中,例如文件/项目结构(a.k.a。 Ctrl - ; )无法理解这些build.gradle
文件。