Android打开dll文件?

Android是基于Linux系统的,那能不能打开windows上运行的dll文件呢?

第一步:编译一个dll文件

代码如下:

cpp 复制代码
//#include <jni.h>
#include <string>


extern "C"
//JNIEXPORT jint JNICALL
//Java_com_example_dllnative_DllNativeLib_add(JNIEnv *env, jobject thiz, jint a, jint b) {
//    return a + b;
//}

void myFunction() {
    printf("Hello from myFunction!\n");
}

然后执行命令编译成一个dll文件:

terminal 复制代码
gcc -shared -o mylibrary.dll dllnative.cpp

将生成的dll文件放到应用的缓存目录下,因为在Android系统里面,如果不使用绝对路径打开,系统会自动加上lib.的前缀和.so的后缀,如果是windows平台的包,且不是绝对路径就会加上前后缀,所以在使用JNA的时候是需要传绝对路径的

比如我这边是放在/data/data目录下 完整JNA代码

java 复制代码
package com.example.dllnative;


import com.sun.jna.Library;
import com.sun.jna.Native;

public interface DllInterface extends Library {

    DllInterface INSTANCE = (DllInterface) Native.load("/data/data/com.example.cadd/files/jni/mylibrary.dll", DllInterface.class);
    void myFunction();
}

然后在Android里面执行即可:

js 复制代码
DllInterface.INSTANCE.myFunction()

哦豁,日常翻车:

说明我刚刚用gcc命令编译的dll包,不是ELF格式,是不能正常加载的,但是dll通常不会是ELF格式,这个就只能看能不能通过交叉编译的方式编译成ELF格式的文件,ok到这里Android几乎可以定性成,不管是加载so还是dll都需要ELF格式,因为他底层的方法都是用到了dlopen这个函数,但是不要灰心,Java是没有这个限制的

但是加载路径需要改变一下,换成电脑内的路径,不然找不到

后边研究研究看能不能通过交叉编译链路重新编译下so或者dll文件,在Android系统中成功加载!!

相关推荐
Java成神之路-13 小时前
Spring AI 统一结构化返回:ChatModel / ChatClient 两种实现方式
java·springaialibaba
Mr. zhihao13 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
vx-程序开发13 小时前
springboot旅游推介平台---附源码24175
java·spring boot·python·spring cloud·eclipse·django·idea
游戏开发爱好者814 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview
艾莉丝努力练剑14 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
小蒜学长14 小时前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
程序员黑豆14 小时前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
AI人工智能+电脑小能手14 小时前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
xbgRS17 小时前
springboot的自动装配
java·spring boot
嘻哈∠※1 天前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端