使用VS2015调试Android的C++动态链接库

使用VS2015调试Android C C++动态链接库

VS2015相对于过去的IDE在跨平台方面做了很大的支持,支持对linux操作系统进行远程GDB调试,由于VS2015强大的C/C++调试功能,本文将介绍,如何用VS2015调试android的动态链接库,跟进行NDK开发。
首先需要去官网下载VS2015 社区版 这个版本是免费使用的虽然部分功能有所限制,但是已经够一般人进行使用了。安装方法可以参照百度经验这里对重复的东西不进行过多的介绍。
- 安装完了之后可以在菜单栏的tools->options->cross-platform修改配置信息。
这里写图片描述
- 这里假设看文章的人已经对java层如何调用NDK层已经有简单了解了,并且能写简单hello-jni。
这里写图片描述
-然后在解决方案,右键再建一个动态链接库
这里写图片描述
- 选择dynamic shared library
这里写图片描述
- build solution 如果有错误请看本文结尾(可能是环境配置的问题) 没错误的话继续,在android层建一个本地方法。

package com.Android1;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class Android1 extends Activity
{
    static{
        System.loadLibrary("hello-jni");
    }
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        /* Create a TextView and set its text to "Hello world" */
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }
    public native String stringFromJNI(); //获取原生层字符串
}
  • 进入工程目录下的android目录下的src目录 使用javah生成头文件
    这里写图片描述

这边使用classpath 我已经配置到系统环境变量了,如果没有配置的话可能会出现找不android v4 v6库之类。
将头文件复制到动态链接库工程根目录下然后创建一个.c文件,并将该头文件引入输入下面代码。将原来的sharedObject头文件跟CPP文件都删了,因为这里用不到

#include <string.h>
#include "com_Android1_Android1.h"

jstring
Java_com_Android1_Android1_stringFromJNI(JNIEnv* env,
    jobject thiz)
{
    return (*env)->NewStringUTF(env, "Hello from JNI ! ");
}

进入shredobject工程选项将预编译关了否则可能会出错
这里写图片描述
对共享库进行编译,正常应该能顺利编译通过。修改共享库生成名称
这里写图片描述
-对解决方案选择默认启动项目
这里写图片描述
-选择依赖
这里写图片描述
这里写图片描述
点击Android工程目录下的References右键添加引用,选择确定。然后就可以运行了
这里写图片描述
运行后调试更简单了,在你要调试的本地代码按F9打断电运行,程序运行后就会在对应的地方中断
这里写图片描述
接下去就可以自由发挥了。

编译错误原因:
- 出现clang.exe错误 版本不对应 ndk r12b 用的是lang3.8 楼主的就是这个版本如果用的是3.6版本的需要使用ndk r10e
- 上面的解决不 了可以尝试安装插件 clang with microsoft codegen 安装方式在 tools->extensions and update 搜索clang安装就可以了
- 如果出现gnu_stlstatic 找不到,请将ndk下对应平台的stl库手动添加
- 对于还有其他问题可以留言楼主有看到的话会及时回复

由于工程非常少 代码都给上了这里就不分享项目工程了,对于按照上述方法还出错的建议使用默认环境,大部分可能出错的地方都是clang.exe错误。 或者是NDK版本不对应找不到对应的库。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用VS2015编译和调用动态链接库dll 1. 首先建工程,选择dll,记得勾上“导出符号” 后面不用自己搞那些宏定义会省事很多。 建立工程myDll,记得勾上“导出符号” 类型选择dll 2. IDE自动生成的代码已经把整个架构弄好了,其中和项目同名的.h和.cpp文件就是我们自己写代码的地方了。我想写的dll是导出一个类,在这里我就直接在它自动生成的CmyDll类上面改了。 myDll.h myDll.cpp 在mydll.h和mydll.cpp中给类添加成员函数 //mydll.h class MYDLL_API CmyDll { public: CmyDll(void); // TODO: 在此添加您的方法。 int myFunction(int a, int b); }; //mydll.cpp int CmyDll::myFunction(int a, int b) { return a*b; } 3.编译的时候我选择了release,这里可以用默认的debug也行 在mydll.h和mydll.cpp中给类添加成员函数 最后生成解决方案后产生的mydll.lib和mydll.dll就是我们需要的二进制文件了。lib文件是编译是要用的,而dll是调用这个的程序运行时需要的。 调用dll 1.重新建立一个工程 这回选择普通的控制台程序就行了。我建了个名为myDllCall的工程。 2.把的头文件include进来,以及连接lib文件 其中 include进来的 myDll.h 和 **#pragma comment()**的lib根据自己的路径写。 #include "stdafx.h" #include "../../myDll/myDll/myDll.h" //头文件 #pragma comment(lib,"../../myDll/Release/myDll.lib") //调用自己写的外部 #include int main() { CmyDll mydll; int a, b; std::cin >> a >> b; std::cout << mydll.myFunction(a, b) <> a >> b; std::cout << mydll.myFunction(a, b) << std::endl; return 0; } 3.dll放到可执行文件同一目录下面 刚刚的代码直接编译没问题,运行会报错. 直接编译没问题,运行会报错 原因是dll要和生成的可执行文件在同一个目录下,我把mydll.dll放进去之后就解决了。 我们成功的在自己的工程里调用了外部的类 可以看到我们成功的在自己的工程里调用了外部的类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值