Jni dll 开发教程 vs2019 + idea

JNI接口 创建一个Java调用C++实例 涉及JAVA与C++之间的参数传递问题 一.背景 某项目需要一个工业视觉系统,系统方面用Java+Vue做业务数据存储,参数配置,系统间交互。其中需要调用底层C++封装的DLL算法。用到JNI接口,调用时主要涉及到图片数据以及一些配置参数传递,数据返回。新建一个简单的JNI接口实现Java和C++交互。 二.实例 开发工具:IDEA,JDK8,VS2019 2.1新建Java JNI接口 public class JniDemo { //方法一 返回名称 public native String getName(); //方 阅读详情

Jni dll 开发教程 vs2019 + idea

创建java类 native方法

💡 加载动态库
  • 函数System.loadLibrary()是加载dll(windows)或so(Linux)库
  • System.loadLibrary(“hello”); 需要将此库放到环境变量的路径中
  • 或者 System.load( System.getProperty(“user.dir”) + “/hello.dll”); 用户目录即程序目录下
  • 若此dll或so依赖别的动态库,需要根据依赖性先后添加动态库
  • 检查动态库依赖 windows:dumpbin.exe /dependents D:\py\hell0.dll
创建Native 方法 生成接口c++头文件

在java中编写jni c++ 要实现的方法 native 修饰
private native long createNativeAvTranscodeObj(int id);
idea 项目 src目录下 :格式 javah package.className
javah AVProcess.AVTranscodeJNI
生成 AVProcess_AVTranscodeJNI.h 有文件 接下来c++ 实现头文件生成动态库便可
生成如下c++函数接口

c++ jni 接口 头文件

#include <jni.h>
/* Header for class AVProcess_AVTranscodeJNI */

#ifndef _Included_AVProcess_AVTranscodeJNI
#define _Included_AVProcess_AVTranscodeJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     AVProcess_AVTranscodeJNI
 * Method:    createNativeAvTranscodeObj
 * Signature: (I)J
 */
JNIEXPORT jlong JNICALL Java_AVProcess_AVTranscodeJNI_createNativeAvTranscodeObj
  (JNIEnv *, jobject, jint);

/*
 * Class:     AVProcess_AVTranscodeJNI
 * Method:    ReleaseNativeAvTranscodeObj
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_AVProcess_AVTranscodeJNI_ReleaseNativeAvTranscodeObj
  (JNIEnv *, jobject, jlong);
java jni接口
package AVProcess;
public class AVTranscodeJNI {

    static {
        // hello.dll (Windows) or libhello.so (Unixes)
        //System.out.println("当前dll加载路径:"+System.getProperty("java.library.path"));
        //System.setProperty("java.library.path", System.getProperty("user.dir") + "/lib");
        System.out.println(System.getProperty("user.dir"));
        System.load( System.getProperty("user.dir") + "/lib/avutil-57.dll");
        System.load( System.getProperty("user.dir") + "/lib/swscale-6.dll");
        System.load( System.getProperty("user.dir") + "/lib/libx264-164.dll");
        System.load( System.getProperty("user.dir") + "/lib/libx265.dll");
        System.loadLibrary(AVTranscode);

    }
    private long nativeAvTranObj;

    public AVTranscodeJNI(int id) {
        nativeAvTranObj = createNativeAvTranscodeObj(id);
    }

    public void finalize(){
        if(nativeAvTranObj != 0){
            ReleaseNativeAvTranscodeObj(nativeAvTranObj);
            nativeAvTranObj = 0;
        }
    }

    public void SetCallback(Callback callback){
        SetNativeCallback(nativeAvTranObj, callback);
    };

    public  int SetCompressLevel(int compressLevel){
        return SetNativeCompressLevel(nativeAvTranObj, compressLevel);
    };

    public int Pause(){
        return NativePause(nativeAvTranObj);
    };

    public int Running(){
        return NativeRunning(nativeAvTranObj);
    };

    public AVTranscoderState GetState(){
        return GetNativeState(nativeAvTranObj);
    };

    public int StartTranscode(String inAvPath, String outAvPath, int compressLevel){
        return StartNativeTranscode(nativeAvTranObj, inAvPath, outAvPath, compressLevel);
    };


    public int GetAvInfo(String avPath, VideoInfo avInfo){
        return GetNativeAvInfo(nativeAvTranObj, avPath, avInfo);
    };

    //native c++
    private native long createNativeAvTranscodeObj(int id);
    private native void ReleaseNativeAvTranscodeObj(long nativeAvTranObj);
    private native void SetNativeCallback(long nativeAvTranObj, Callback callback);
    private native int SetNativeCompressLevel(long nativeAvTranObj, int compressLevel);
    private native int NativePause(long nativeAvTranObj);
    private native int NativeRunning(long nativeAvTranObj);
    private native AVTranscoderState GetNativeState(long nativeAvTranObj);
    private native int StartNativeTranscode(long nativeAvTranObj, String inAvPath, String outAvPath, int compressLevel);
    private native int GetNativeAvInfo(long nativeAvTranObj, String avPath, VideoInfo avInfo);

    public static void main(String[] args) {
        System.out.println("Hello world!");
        AVTranscodeJNI transcoder = new AVTranscodeJNI(0);
        System.out.println(transcoder.GetState());
        VideoInfo avInfo = new VideoInfo();
        int ret = transcoder.GetAvInfo("00003.mp4", avInfo);
        System.out.println(avInfo);
        ret = transcoder.StartTranscode("000003.mp4", "out.mp4", 0);
        System.out.println(ret);
    }
}

开发 c++ dll

采用vs2019 开发 创建项目->动态库 直接将AVProcess_AVTranscodeJNI.h 复制到项目目录中便可

接口参数

JNIEnv 运行线程环境,jobject java调用对象 这两个是固定参数,其余是函数参数

保存c++ 对象方便调用

保存c++类对象地址存储为 java long nativeAvTranObj
java

private long nativeAvTranObj;

    public AVTranscodeJNI(int id) {
        nativeAvTranObj = createNativeAvTranscodeObj(id);
    }
JNIEXPORT jlong JNICALL Java_AVProcess_AVTranscodeJNI_createNativeAvTranscodeObj(JNIEnv* env, jobject obj, jint id) {
    Transcode* transcoder = NULL;
    transcoder = new Transcode(id);
    if (transcoder)
        return jlong(transcoder);
}
传入修改java对象

java 实现

    public int GetAvInfo(String avPath, VideoInfo avInfo){
        return GetNativeAvInfo(nativeAvTranObj, avPath, avInfo);
    };

c++jni 实现

JNIEXPORT jint JNICALL Java_AVProcess_AVTranscodeJNI_GetNativeAvInfo(JNIEnv* env, jobject obj, jlong tranObjAddr, jstring javPath, jobject javInfo) {
    Transcode* transcoder = (Transcode*)tranObjAddr;
    std::string avPath = JavaStringToString(env, javPath);
    if (avPath.empty()) {
        return -10000;
    }
    AVFileInfo avInfo;
    transcoder->GetVideoinfo(avPath, avInfo);

    jclass jclass_AvInfo = env->GetObjectClass(javInfo);

    jfieldID jformatId = env->GetFieldID(jclass_AvInfo, "format", "Ljava/lang/String;");
    jstring jfmtStr = StringToJavaString(env, avInfo.format);
    env->SetObjectField(javInfo, jformatId, jfmtStr);

    jfieldID jdurationSecsId = env->GetFieldID(jclass_AvInfo, "durationSecs", "I");
    env->SetIntField(javInfo, jdurationSecsId, avInfo.durationSecs);

    env->DeleteLocalRef(jclass_AvInfo);
    return 0;
}
c++ 中获得 java对象字段 方法

jclass jclass_AvInfo = env->GetObjectClass(javInfo); 获得java 类对象引用
jfieldID jformatId = env->GetFieldID(jclass_AvInfo, "format", "Ljava/lang/String;"); 获得类数据字段Id
env->SetObjectField(javInfo, jformatId, jfmtStr);设置数据字段值

JavaNative Interface FieldDescriptors

jni 字段描述符
Ljava/lang/String; string 数据字段
javac VideoInfo.java 生成 VideoInfo.class
javap -s -p VideoInfo.class 查看字段描述命令

java.lang.String format;
    descriptor: Ljava/lang/String;
  int durationSecs;
    descriptor: I
  long bitrate;
    descriptor: J

方法描述:

  private native AVProcess.VideoInfo GetNativeInAVInfo(long);
    descriptor: (J)LAVProcess/VideoInfo;

  private native AVProcess.VideoInfo GetNativeOutAVInfo(long);
    descriptor: (J)LAVProcess/VideoInfo;

  private native AVProcess.VideoInfo GetNativeAvInfo(long, java.lang.String);
    descriptor: (JLjava/lang/String;)LAVProcess/VideoInfo;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V

  static {};

c++ string 与java jstring 互转

windows 下 c++ 17

#include <windows.h>
std::string JavaStringToString(JNIEnv* env, jstring str) {
    if (env == nullptr || str == nullptr) {
        return "";
    }
    const jchar* chars = env->GetStringChars(str, NULL);
    if (chars == nullptr) {
        return "";
    }

    std::wstring wstring = reinterpret_cast<const wchar_t*>(chars);
    std::string u8_string;
    int dstWStrSize = WideCharToMultiByte(CP_ACP, 0, wstring.c_str(), wstring.size(), NULL, 0, NULL, NULL);
    if (dstWStrSize <= 0) {
        return "";
    }
    u8_string.resize(dstWStrSize);
    dstWStrSize = WideCharToMultiByte(CP_ACP, 0, wstring.c_str(), wstring.size(), &u8_string[0], u8_string.size(), NULL, NULL);
    //env->GetStringLength(str));
    env->ReleaseStringChars(str, chars);
    return u8_string;
}

jstring StringToJavaString(JNIEnv* env, const std::string& u8_string) {
    int dstStrSize = MultiByteToWideChar(CP_ACP, 0, u8_string.c_str(), u8_string.size(), NULL, 0);
    if (dstStrSize <= 0) {
        return NULL;
    }
    std::wstring wstring;
    wstring.resize(dstStrSize);
    int writedCharLen = MultiByteToWideChar(CP_UTF8, 0, u8_string.c_str(), u8_string.size(), &wstring[0], wstring.size());
    auto result = env->NewString(reinterpret_cast<const jchar*>(wstring.data()),
        wstring.length());
    return result;
}
设置c++ 回调java 函数

java

package AVProcess;

public interface Callback {
    public default void call(int id, int state, int progressRate){
        System.out.printf("id: %d, state: %d, progressRate: %d", id, state,progressRate);
    }
}
    public void SetCallback(Callback callback){
        SetNativeCallback(nativeAvTranObj, callback);
    };

jni c++

static JavaVM* jvm = NULL;
static jclass jcls = NULL;
static jmethodID methodId = NULL;

JNIEXPORT void JNICALL Java_AVProcess_AVTranscodeJNI_SetNativeCallback(JNIEnv* env, jobject obj, jlong tranObjAddr, jobject callObj) {
    jcls = env->GetObjectClass(callObj);
    methodId = env->GetMethodID(jcls, "call", "(I)V");
    Transcode* transcoder = (Transcode*)tranObjAddr;
    transcoder->SetCallback(ReportProgress);
    //env->CallVoidMethod(callObj, method, 5);
}

全局保存回调接口类引用、字段id、方法
c++ 回调

void CallBacl(int id, int state, int progressRate) {
    JNIEnv* env;
    if (!jvm || !jcls || !methodId)
        return;
    jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), nullptr);
    jobject jobj = env->NewObject(jcls, methodId);
    env->CallVoidMethod(jobj, methodId, id, state, progressRate);
    env->DeleteLocalRef(jobj);
    jvm->DetachCurrentThread();
}

jvm: java 运行虚拟机环境
在 jni c++ 中获取 在java中执行 System.loadLibrary(AVTranscode);时自动执行此函数

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
    jvm = vm;
    JNIEnv* env;
    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_8) != JNI_OK) {
        return JNI_ERR;
    }
    return JNI_VERSION_1_8;
}
返回java 枚举对象

java
getAVTranState 方便 jni c++ 通过互相对应的值调用生成

package AVProcess;

public enum AVTranscoderState{
    READY, RUNNING, PAUSE, ENDING, FINISHED, EXIT, FAILURE;

    public static AVTranscoderState getAVTranState(int ordinal){
        AVTranscoderState states[] = values();
        if(ordinal < states.length && ordinal >= 0)
            return states[ordinal];
        return null;
    }
};

c++

JNIEXPORT jobject JNICALL Java_AVProcess_AVTranscodeJNI_GetNativeState(JNIEnv* env, jobject obj, jlong tranObjAddr) {

    Transcode* transcoder = (Transcode*)tranObjAddr;
    int state = int(transcoder->GetState());

    jclass jState = env->FindClass("AVProcess/AVTranscoderState");
    jmethodID j_method_getAVState = env->GetStaticMethodID(jState, "getAVTranState", "(I)LAVProcess/AVTranscoderState;");
    jobject objState = env->CallStaticObjectMethod(jState, j_method_getAVState, state);

    env->DeleteLocalRef(jState);
    return objState;
}

jmethodID: 获取java 方法

Java JNI实战:创建依赖第三方DLL的本地库与IDEA集成指南 Java Native Interface(JNI)是Java平台调用本地(Native)代码的标准接口,它允许Java程序与C、C++等语言编写的库进行交互,从而突破Java虚拟机(JVM)的限制,直接利用操作系统底层能力或复用高性能的遗留代码。其核心原理是通过预定义的命名规范和数据类型映射,在Java代码中声明native方法,并由本地动态链接库(如Windows的DLL)提供具体实现。这项技术的价值在于为Java应用提供了扩展性能边界、集成特定硬件驱动或复用成熟本地库的能力,常见于图像处理、加密解密、 阅读详情

相关推荐

dll动态库生成与调用(2):Java程序利用JNI、JNA调用动态库

简介 本文主要内容是使用JNA、JNI调用dll动态库。 因为JNI的使用在菜鸟教程中已经有了比较完整的介绍,所以我在本文中就只是提了一下JNI需要注意的事项,菜鸟教程的网址我已经贴在JNI那一章节。JNI教程中使用的是eclipse,如果你使用IDEA,那么你可以看JNA教程中是如何设定库目录的。 开发环境 IDE: Visual Studio 2015、IDEA 2019.1 JNA(Java...

Stone Ocean 1803

纯Java角度开发JNI (工具使用IDEA、CLion)

文章目录一、跨语音调用的意义二、首先新建java工程三、生成jni头文件四、其次新建c工程五、jni头文件配置方式一(根目录CMakeLists.txt配置)方式二(拷贝jni.h、jni_md.h jni到项目中)六、编译生成动态库七、使用java运行c 一、跨语音调用的意义 作为跨语言调用的开源方式,非常????的主要有以下三个 Java -> c : java native interface Javascript -> java : react-native Javascript -&

流星雨的博客 3143

Java JNI例子--创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)

创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)

半夜不熬夜的博客 1881

idea java jni 调试_IntelliJ IDEA平台下JNI编程(一)—HelloWorld篇

JNI(Java Native Interface),出于学习JNI的目的,为了能够更方便快速地运行程序。本文的是在IDEA中进行,而不在AndroidStudio,这样能够对NDK的工作过程有个更深刻的认识,同时也能对JNI的原理有更深的理解。虽然本文是HelloWorld篇,但是其中涉及到很多内容。博主将遇到的坑都记录下来了,希望能够帮到大家。这篇文章可能是2016年的最后一篇文章了,接下来J...

weixin_39610964的博客 745

visual studio 2019下C++通过JNI调用JAVA代码

visual studio 2019下C++通过JNI调用JAVA代码,实现一个简单的打印输出!!!

JAV.zip_jaV.H0D_jav.com_jav513_javjobvideo日韩_vjav

yrtos_ MULTITASKING RTOS,.

【Java基础】JNI机制开发指南—认识JNI原理及如何用 Java 调用 C 的动态链接库

java是一种跨平台的语言,那么它为什么能做到跨平台,`实际上是因为不同的平台(windows、linux、mac-os)java有不同的解释器,对应java不同的虚拟机(JVM)`,这样,就可以做到`源代码文件(.java)只需一次编译成字节码文件(.class),就可以在不同的平台运行 `。而java不是万能的,有些操作需要调用`操作系统平台API`实现,`JNI`就是Java用于和`其他语言`进行互操作的API,称为`Java Native Interface (Java本地接口)`

墩墩分墩 4406

VS2019开发简单的C/C++动态链接库并进行调用的实现

主要介绍了VS2019开发简单的C/C++动态链接库并进行调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

『Java安全』JavaNativeInterface(JNI)调用DLL_利用vs2019编写DLL

文章目录定义测试类生成头文件vs2019编写DLL新建vs项目导入头文件编写DLL生成DLLJNI调用DLL完 定义测试类 定义一个测试类,声明一个native方法,然后加载DLL文件(自定义名称),声明main调用这个方法 package JavaNativeIntf; public class JNITest { public native void hello(); public static void main(String[] args) { System.lo

Ho1aAs‘s Blog 1509

基于STM32平衡小车设计

随着智能硬件的发展,基于STM32的两轮智能平衡车作为一种新型的智能移动工具,具备较高的应用价值。本文旨在设计并实现一款基于STM32微控制器的智能平衡车系统,提升其稳定性和操控性,探索如何通过传感器数据和控制算法实现精确平衡控制。 本设计基于STM32微控制器,选择了STM32F103系列作为核心控制器,具有足够的处理能力和丰富的外设接口。系统通过MPU6050传感器获取三轴加速度和三轴陀螺仪数据,实现实时姿态检测。电机驱动部分采用合适的驱动模块,能够控制两个直流电机,并支持PWM调速。设计中还包括OL

m0_74026776的博客 2730

【硬核指南/MI50 32G/Ubuntu】从零部署大模型:MI50显卡Ubuntu系统驱动安装与避坑全记录

本文详细记录了在Ubuntu系统上为AMD MI50显卡安装驱动并部署大模型的完整流程,包括硬件兼容性检查、BIOS关键设置、系统安装优化、ROCm驱动安装及常见问题解决方案。特别针对MI50显卡在X99平台上的特殊配置需求提供了实用技巧,帮助用户避免常见陷阱,提升大模型训练效率。

weixin_42520909的博客 803

IntelliJ idea 2018 平台下JNI编程调用C++算法(一)

参考来源: http://blog.sina.com.cn/s/blog_b37338430101f3zq.html http://www.cnblogs.com/xiaocainiao2hao/p/5619862.html https://blog.csdn.net/aslgm_1/article/details/71514617 【huachao1001的专栏:http://blog...

wsxzhbzl的博客 1万+

Cartographer从安装到实战:手把手教你运行2D/3D建图与定位

本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。

rice5的博客 949

idea没有out文件夹_史上最详细没有之一的 Java JNI傻瓜级入门教程

本文使用java的IDEA和visual studio2017来详细的一步一步演示java的JNI构建过程(eclipse+vs2017的教程在文末)1.打开java的IDEA,file->new,新建名为JNITIME的项目,在接下来出现的界面左侧找到名为src的文件夹图案,右击->new->package,命名为com.aijiao.test。在com.aijiao.test...

weixin_34254464的博客 3077

日前日内多阶段多时间尺度源荷储协调调度(matlab代码)

多阶段多时间尺度的协调调度的优势是考虑新能源出力的波 动性与随机性,需求响应负荷的不确定性会对电网制定的日前调度计划准确性造成影响,也就是能够更加精准的进行调度和分析,优化结果的可用性更强。在这方面论文里面,金力的《考虑特性分布的储能电站接入的电网多时间尺度源储荷协调调度策略》就考虑了日前日内实时三个阶段调度,每个阶段考虑了不同负荷需求响应策略,同时考虑了负荷波动性的影响,具有很强的参考意义。 目录 一、模型 二、程序运行 三、程序链接 一、模型 负荷需求响应考虑电价型和激励型两种,电.

zhangxd212489的博客 7915

保姆级教程:用Anaconda+PyCharm搞定YOLOv8本地部署(附避坑指南)

本文提供了一份详细的YOLOv8本地部署指南,涵盖Anaconda环境配置、PyCharm集成到模型部署的全过程。特别针对国内开发者需求,整合了镜像加速和常见报错解决方案,帮助快速完成目标检测模型的本地部署与实战应用。

weixin_42528090的博客 432

Java笔记-JNI的基本使用(Java调用C++的dll)

目录 基本概念 过程演示 基本概念 JNI(Java Native Interface),这个是Java本地接口,可以调用Windows上的dll或者Linux上的so文件,当然要按照他的规范进行编写。感觉这个和Qt写Android程序的逻辑差不多,为什么这么说呢? 在Java目录下,有专门生成动态链接库的.h文件。通过包含这些文件使得Java能够调用dll。 而Qt在下载...

IT1995的博客 6156

Android应用之【巧妙隐藏桌面图标的进阶方案】

本文详细探讨了Android应用中隐藏桌面图标的进阶方案,解决了传统方法在Android 10及以上版本中出现的黑色图标残留问题。通过Intent-Filter配置和厂商适配技巧,实现子应用真正隐身,同时确保主应用正常启动。适用于企业工具套件、模块化系统等场景,提升用户体验和安全性。

weixin_28363123的博客 504

idea算法java_在idea2018和vs2017平台下JNI编程调用C++算法(1)-环境搭建

在idea2018和vs2017平台下JNI编程调用C++算法(1)-环境搭建JNI简介JNI是Java Native Interface的简称,通过JNI,可以调用C++或C的程序(称为本地程序)。应用场景我认为应用场景可以用三个字概括“不得不”,即只有遇到必须跨语言的时候,才会选择JNI。从Java的场景出发,使用JNI意味着失去了跨平台的优势;从C++的角度想,可能需要将程序发布到安卓端等,...

weixin_42169971的博客 710

Python经典编程习题100例:第32例:相反顺序输出列表

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 按相反的顺序输出列表的值。 解题思路: > 利用reverse函数逆序 代码: arr=['f','g','e','b'] print(arr) arr.reverse() print(arr) ...

优快云 精品推荐 1416

【ROS2】机械臂MoveIt2

navigation2 专注于移动机器人的导航与定位,处理大范围空间的底盘运动;MoveIt2 专注于机械臂的操作规划,处理多关节协同的末端执行器运动。在复合机器人(如,移动机械臂)navigation2 负责移动到目标区域,MoveIt2 负责机械臂抓取。官网:https://moveit.picknik.ai/main/index.html。

郭老二 593

【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )

I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edition 创建 Java 项目 V . Java 定义的 Native 方法 VI . C++ 中实现上面定义的 Native 方法 VII . CMake 项目生成 dll 动态库 VIII . Java 中加载调用动态库 IX . 使用 javah 工具生成 C++ 中需要实现的 Native 方法 ( 仅做参考 )

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 4874

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java嵌套调用dll_在idea2018和vs2017平台下JNI编程调用C++算法(2)-调用嵌套dll实践...

##背景 我之所以采用JNI是由于我要实现一个java系统,java系统需调用C++核心程序。而目前的需求是不想破坏C++核心程序的独立性。因此想把JNI调用的接口写在C++核心程序之外。这就需要首先将C++核心程序生成内层dll在外层包装一层JNI接口调用内层dll再将外层C++生成外层dll后,java调用外层dll.那么JNI支持这种嵌套dll调用吗?经验告诉我肯定能,但是程序员从来不敢想当...

weixin_42231590的博客 237

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

windows下jni调试dll

jni调试其实就是源码调试技术,因为调用者是java程序,在idea下没有办法直接从java的jni接口进入c++实现的函数进行调试,但是有一种办法可以实现。对c++比较了解的朋友可能会知道咱们在使用vs编译生成二进制文件时,编译器会产生一个符号文件(*.pdb文件),只要调试器在调试该PE程序时,同时加载了这个pdb文件,那么调试器就会根据符号文件与源码进行匹配,从而实现源码调试。 1、确保dll项目的编译选项中生成了pdb文件(vs2017) 2、查找java进程id(windows10下) 打开任务

u011460470的博客 1142

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android 平台的Python-JNI方案(二)-详细版

上一篇博客已经讲了Python与C的交互,本篇主要关于在Android项目中嵌入Python解释器,实现Java与Python相互调用。已有好的项目提供了思路,地址:https://github.com/joaoventura/pybridge 这里说一下简单实现 1 环境准备 从Crystax下载NDK。 配置好crystax ndk环境,并创建一个NDK项目,将crystax 包下面的 libpython3.5m.so拷贝至工程 lib/armeabi目录下 2 为Java 编写 native

sophicchen的专栏 3359

idea java jni 调试_IntelliJ IDEA平台下JNI编程—HelloWorld篇

JNI(Java Native Interface),出于学习JNI的目的,为了能够更方便快速地运行程序。本文的是在IDEA中进行,而不在AndroidStudio,这样能够对NDK的工作过程有个更深刻的认识,同时也能对JNI的原理有更深的理解。虽然本文是HelloWorld篇,但是其中涉及到很多内容。博主将遇到的坑都记录下来了,希望能够帮到大家。这篇文章可能是2016年的最后一篇文章了,接下来J...

weixin_29122445的博客 400
上一篇: 获取本机Ip信息
hiprogram
博客等级 码龄10年 1粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值