Android NDK Eclipse断点JNI调试C++基础详解

本文介绍如何通过Java Native Interface (JNI) 在Android应用中调用C++代码。包括搭建开发环境、创建JNI函数、配置编译参数及调试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 应用程序可以用C++开发,但是C++并不友好,所以JNI应运而生,有了JNI就可以使用JAVA来调用C++的函数,我也是总结一些各位博客大神经验了呵呵。

废话不多说开始准备工具adt和ndk包吧,全部放在自己百度云里或优快云连接


1.adt-bundle-windows-x86_64-20140702.exe  下载地址

2.android-ndk-r10e-windows-x86_64.exe  下载地址

3.com.android.ide.eclipse.ndk_23.0.2.1259578.jar  下载地址


第一步:安装好adt并搭建好一般的android开发环境,这里用的是SDK android-19也就是android4.4.2

第二步:把com.android.ide.eclipse.ndk_23.0.2.1259578.jar 放入到  “你的ADT安装目录\eclipse\plugins\com.android.ide.eclipse.ndk_23.0.2.1259578.jar”

第三步:安装 android-ndk-r10e-windows-x86_64.exe,添加环境变量 NDK_ROOT 指向NDK的安装目录(也有时发现不设置环境变量也可以)


以上工作做好后可以打开你的Eclipse配置一下自己的NDK路径了

接下来开始首先建一个普通的工程,右键Android Tools->Add Native Support,然后会提示你生成一些JNI相关的文件夹


目录下多了一个jni文件,而且文件下还有一个.cpp,和.mk文件


这个cpp文件就是用给我们写C++函数库的,以便于调用,我们给cpp文件写一个简单函数

#include <jni.h>


extern "C"
JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_stringFromJNI(JNIEnv *env,jobject thiz)
{
	return env->NewStringUTF("123HelloWorld123");
}

注意函数名命名必须是Java+ 包名+类名+ 函数名且中间必须以下划线隔开,这样一个函数就能被java里的指定的这个类所调用了

为了调试还在要jni文件夹中加一个Application.mk文件

APP_OPTIM := debug
APP_PLATFORM := android-14
APP_ABI := armeabi-v7a

再来写JAVA那边的函数

Layout就放一个按钮

  <Button
        android:id="@+id/jnitbn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="JNI" />

MainActivty中点这个按钮就调用C++的stringFromJNI

package com.example.hellondk;


import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		 findViewById(R.id.jnitbn).setOnClickListener(new View.OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					
					String text=stringFromJNI();
					
					Toast.makeText(MainActivity.this, text, Toast.LENGTH_LONG).show();
					
				}
			});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
	
	
    public native String stringFromJNI();
    
    static {
        System.loadLibrary("TestNdk");
    }
    
}
这样调用是OK的,但是你会发现断点还是进不去,为什么呢

因为还在这里加参数

ndk-build NDK_DEBUG=1     编译为可调试版的二进制文件
ndk-build NDK_DEBUG=0     编译为release版
ndk-build V=1                            执行ndk-build且打印出它所执行的详细编译命令



这样在C++里打的断点就有效了,还真不容易。附上最终源码:下载地址





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值