JIN学习一、Android使用已有C/C++代码、第三方SO库的方法

1.配置好NDk编译环境(这个Google一下,:))

2.将已有C/C++代码,编译成SO文件

3.Eclipse中新建Android工程,创建一个jni目录。如下所示


4.在jni目录创建C/C++文件,里面调用步骤2函数,或者第三方SO的函数

5.创建Android.mk文件,内容为:

LOCAL_PATH := $(call my-dir)
# Link libXXX.so
include $(CLEAR_VARS)  
LOCAL_MODULE :=XXX  
LOCAL_SRC_FILES := libXXX.so  
#LOCAL_SRC_FILES := /jni/libXXX.so  
include $(PREBUILT_SHARED_LIBRARY)  

include $(CLEAR_VARS)
LOCAL_MODULE    := XXXAgent
LOCAL_SRC_FILES := XXXAgent.cpp
LOCAL_SHARED_LIBRARIES := XXX
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY)

将XXX替换为编译出的SO或者第三方SO的名字

6.将jni目录下的C/C++编译成Android通过JNI调用的SO文件,这里名字为  libXXXAgent.so

7.Android工程中使用时,首先加载一下用到的SO库,即可正常使用了。

System.loadLibrary("XXX");
System.loadLibrary("XXXAgent");

说明:这里的重点是如何调用第三方SO库,所有部分细节没有表述。比如Javah生成相关头文件,jni调用等。


补充:上面步骤可能比较多,这里举一个例子加以说明。某天,你得到一个第三SO库,名字就叫XXX。你发现里面的功能正好是你Android项目里需要的,可以拿来就用。这个消息令你高兴万分啊那是。但是,如何在Android里使用呢,XXX库里的调用约定不符合JNI规定,是不能直接来用的。哈哈,想到了,创建一个XXXAgent.so。它的调用采用JNI,然后在实现里调用第三方SO就可以了。以上就是大概的思路。


SO文件是如何自动安装到虚拟机或者手机上呢,NDK生成的SO文件会自动放到libs/armeabi目录下。而此目录下的SO文件都会自动打包到APK,安装后释放到/data/data/项目名字/lib/下。这里XXXAgent.SO文件生成libs/armeab,XXXAgent.SO依赖XXX文件,XXX文件自动拷贝到libs/armeab下。(XXX文件放在jni下,和Android.mk同级,这个是和Android.mk里的设置配合使用的)


  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
你好,我可以回答这个问题。以下是一个用C语言编写的识别和定位照片的代码,该代码使用了yolo5模型文件: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> // 定义yolo5模型的输入和输出大小 #define INPUT_SIZE 416 #define OUTPUT_SIZE 85 // 定义yolo5模型的输出结构体 typedef struct { float x, y, w, h, confidence; float classes[80]; } detection; // 定义sigmoid函数 float sigmoid(float x) { return 1.f / (1.f + expf(-x)); } // 定义softmax函数 void softmax(float *input, int n) { float max = input[]; for (int i = 1; i < n; i++) { if (input[i] > max) { max = input[i]; } } float sum = .f; for (int i = ; i < n; i++) { input[i] = expf(input[i] - max); sum += input[i]; } for (int i = ; i < n; i++) { input[i] /= sum; } } // 定义yolo5模型的前向传播函数 void forward(float *input, float *output, int input_size, int output_size) { // TODO: 实现yolo5模型的前向传播 } // 定义yolo5模型的后处理函数 void postprocess(float *output, int output_size, detection *detections, int *num_detections) { // TODO: 实现yolo5模型的后处理 } // 定义yolo5模型的识别和定位函数 void detect(char *image_path, char *model_path, detection *detections, int *num_detections) { // 读取图片 FILE *fp = fopen(image_path, "rb"); if (fp == NULL) { printf("Error: failed to open image file!\n"); exit(1); } fseek(fp, , SEEK_END); int image_size = ftell(fp); fseek(fp, , SEEK_SET); unsigned char *image_data = (unsigned char *)malloc(image_size); fread(image_data, 1, image_size, fp); fclose(fp); // 读取模型 fp = fopen(model_path, "rb"); if (fp == NULL) { printf("Error: failed to open model file!\n"); exit(1); } fseek(fp, , SEEK_END); int model_size = ftell(fp); fseek(fp, , SEEK_SET); float *model_data = (float *)malloc(model_size); fread(model_data, 1, model_size, fp); fclose(fp); // 进行识别和定位 float *input = (float *)malloc(INPUT_SIZE * INPUT_SIZE * 3 * sizeof(float)); float *output = (float *)malloc(OUTPUT_SIZE * OUTPUT_SIZE * 3 * sizeof(float)); forward(input, output, INPUT_SIZE, OUTPUT_SIZE); postprocess(output, OUTPUT_SIZE, detections, num_detections); // 释放内存 free(image_data); free(model_data); free(input); free(output); } int main(int argc, char **argv) { // TODO: 调用detect函数进行识别和定位 return ; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值