ubuntu下make编译生成动态库,然后python调用cpp。


还是以OpenTLD为例,编写的Makefile和python调用cpp。

代码直接下载:Here。 (Makefile文件最后一行rm -r interface.so前面的空格要删去,换成tab)


Makefile文件如下:

CC=g++
AR=ar rc

OBJ_DIR=lib
OUTPUT_DIR=output

INCLUDE_FLAGS=-I./include -I./opencv_include
CPP_FLAGS=-std=c++11 -pthread -fPIC 
LD_PATH_FLAGS=-L. -L./lib -L./boost_lib -L./opencv_lib
LD_FLAGS= -lopencv_highgui -lopencv_core -lopencv_nonfree -lopencv_legacy -lopencv_video -lopencv_imgproc -lOpenTLD
MACRO_FLAGS=-D_REENTRANT

ifeq ($(CPU_ONLY),1)
    MACRO_FLAGS += -D CPU_ONLY
endif


#libOpenTLD: $(OBJ_DIR)/FerNNClassifier.o $(OBJ_DIR)/LKTracker.o $(OBJ_DIR)/TLD.o $(OBJ_DIR)/tld_utils.o
#	$(CC) -shared -o libOpenTLD.so $^ $(LD_PATH_FLAGS) $(LD_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/FerNNClassifier.o: FerNNClassifier.cpp
#	$(CC) -c -O2 -g -o $@ FerNNClassifier.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/LKTracker.o: LKTracker.cpp
#	$(CC) -c -O2 -g -o $@ LKTracker.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/TLD.o: TLD.cpp
#	$(CC) -c -O2 -g -o $@ TLD.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)
#$(OBJ_DIR)/tld_utils.o: tld_utils.cpp
#	$(CC) -c -O2 -g -o $@ tld_utils.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)


interface: $(OBJ_DIR)/interface.o $(OBJ_DIR)/libOpenTLD.so
	$(CC) -shared -o interface.so $^ $(LD_PATH_FLAGS) $(LD_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)

$(OBJ_DIR)/interface.o: interface.cpp
	$(CC) -c -O2 -g -o $@ interface.cpp $(INCLUDE_FLAGS) $(CPP_FLAGS) $(MACRO_FLAGS)


clean:
	rm -f $(OBJ_DIR)/*.o
	rm -f libOpenTLD.so
	rm -f interface.so


用c封装一层代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include<opencv2/legacy/legacy.hpp>
#include "tld_utils.h"
#include <iostream>
#include <sstream>
#include "TLD.h"
#include <stdio.h>

using namespace std;
using namespace cv;
 
#ifdef __cplusplus
extern "C" {  
    
    TLD tld;  
    bool tl = true;
    //FILE  *bb_file = fopen("./bounding_boxes.txt", "w");
    /*
    void tld_read() {  
        string filename = "./parameters.yml";
        FileStorage fsto(filename, FileStorage::READ);
        tld.read(fsto.getFirstTopLevelNode());   
      }*/  
/*
    void tld_init(const cv::Mat& last_gray,const cv::Rect &box) {  
	//TLD initialization
	tld.init(last_gray, box, bb_file);   
      }  */
/*
    bool tld_processFrame(const cv::Mat& last_gray,const cv::Mat& current_gray){
        BoundingBox pbox;
	vector<Point2f> pts1;
	vector<Point2f> pts2;
        bool status = true;
        tld.processFrame(last_gray, current_gray, pts1, pts2, pbox, status, tl, bb_file);
        return status;
      }*/
    
} 
#endif


python调用.so测试:

# -*- coding: utf-8 -*-
import os
import ctypes

current_dir = os.getcwd()

ctypes.CDLL(os.path.join(current_dir, "libOpenTLD.so"), ctypes.RTLD_GLOBAL)
so = ctypes.CDLL(os.path.join(current_dir, "libOpenTLD.so"))



<think>好的,我现在要回答用户的问题:“如何在 Android Studio 中启动应用程序”。首先,我需要确保自己了解整个过程,然后按照步骤清晰地解释给用户。 首先,用户可能刚刚创建了一个新项目,或者已经有一个现有的项目,想要运行他们的应用程序。我应该从基本的步骤开始,比如确保项目配置正确,设备连接正常,然后才是运行应用。记得要提到如何选择设备,比如模拟器或真机调试,因为这是常见的问题点。 接下来,用户可能遇到的问题包括设备未连接、应用无法安装或者启动崩溃。这时候需要参考站内引用中的内容。比如,引用[3]提到设备连接但显示离线,可能需要重启ADB。还有引用[4]提到的安装问题,比如testOnly属性导致无法安装,这时候可能需要使用adb install -t命令,或者检查小米手机的用户权限设置。这些都需要在注意事项里提到。 然后,步骤部分需要分点说明,每一步要具体,但不过于冗长。例如,第一步是打开项目,确保有Main Activity。第二步选择设备,这里可以分模拟器和真机两种情况。第三步点击运行按钮,这里可以说明快捷键,以及如何构建APK。第四步处理构建后的情况,比如安装到设备,并自动启动应用。 注意事项部分需要涵盖常见错误和解决方法,比如设备离线、安装失败、启动崩溃等。特别是引用中提到的ADB问题,可能需要重启ADB或者Android Studio,以及处理testOnly属性的情况。此外,小米手机的INSTALL_CANCELED_BY_USER错误,需要提示用户开启USB安装权限,这也是引用[4]提到的内容。 最后,生成相关问题,需要覆盖用户可能进一步想知道的内容,比如连接设备、创建模拟器、调试应用崩溃、解决安装失败等。这些问题应该自然延伸自当前主题,帮助用户深入学习。 在写作过程中,要确保使用正确的中文表达,避免技术术语错误,同时引用相关引用来源。比如,在注意事项中,当提到设备离线时,引用[3]说明可能需要重启ADB。提到安装问题时,引用[4]中的testOnly属性和小米手机的问题。这些引用需要自然地融入到解答中,帮助用户理解问题来源。 现在,我需要整理这些思路,按照用户要求的格式,分步骤和注意事项,引用正确的来源,并生成相关问题。同时,检查是否有遗漏的要点,比如是否需要提到Gradle配置或者Manifest文件中的设置,但根据用户的问题,可能主要集中在启动应用的步骤和常见问题,所以可能不需要深入Gradle的细节,除非必要。 总结一下,回答的结构应该是: 1. 步骤:分点说明如何启动应用,包括选择设备和运行。 2. 注意事项:涵盖设备连接、安装问题、启动崩溃,引用相关文献。 3. 相关问题:生成用户可能感兴趣的其他问题。 确保每一步都清晰,语言简洁,正确引用来源,并且覆盖用户可能遇到的典型问题。</think>### 如何在 Android Studio 中启动应用程序 #### 步骤说明 1. **打开项目并配置** 确保项目已正确配置,且包含一个有效的 `MainActivity` 作为入口。若为新项目,Android Studio 会自动生成此文件。 2. **选择运行设备** - **模拟器**:在工具栏点击设备选择下拉菜单,选择已创建的虚拟设备(如未创建需先通过 AVD Manager 添加)[^3]。 - **真机调试**:通过 USB 连接手机,并启用开发者选项和 USB 调试模式。在设备选择菜单中会显示设备名称[^2]。 3. **运行应用程序** 点击工具栏的绿色运行按钮(或按 `Shift + F10`),Android Studio 会自动构建 APK 文件并安装到目标设备。构建成功后,应用将自动启动[^1]。 4. **查看运行结果** 应用启动后,可通过 Logcat 查看日志输出,或在设备上直接交互。若代码有修改,可重新点击运行按钮进行增量更新。 --- #### 注意事项 1. **设备离线问题** 若设备显示为 `offline`,尝试重启 ADB: ```bash adb kill-server && adb start-server ``` 或通过 Android Studio 的 `File > Invalidate Caches / Restart` 重启 IDE 。 2. **安装失败处理** - 若出现 `INSTALL_CANCELED_BY_USER`(常见于小米手机),需在手机设置中开启“USB安装”权限[^4]。 - 若提示 `testOnly` 限制,使用命令安装: ```bash adb install -t your_app.apk ``` 3. **应用启动崩溃** 检查 `AndroidManifest.xml` 中是否正确定义了启动 Activity,或通过 Logcat 查看具体错误日志(如空指针异常)。 --- ### 相关问题 1. 如何通过 Android Studio 连接物理设备进行调试? 2. 如何在 Android Studio 中创建和管理虚拟设备(AVD)? 3. 应用启动后出现崩溃应如何调试? 4. 如何解决 Android Studio 中 APK 安装失败的问题? --- #### 引用来源 : 从Android Studio重新启动ADB(Restart ADB from Android Studio)。 [^2]: 使用 Android 2.2 作为目标版本,但其他版本也适用。 : 设备连接但显示离线时,重启 ADB 或 Android Studio 可能解决问题。 [^4]: 小米手机需开启 USB 安装权限,避免 `INSTALL_CANCELED_BY_USER` 错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值