7 Star 20 Fork 8

神经猫 / ImgJni

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

如果不知道jni如何使用生成,请看项目scalacpptest中的java代码解释部分

如何加载jar包中dll,dylib,so,请看项目loaddll

这个例子是示例jni调用c++自定义类

  • 换个意思就是java能通过jni调用c++类
  • 思想是返回c++类的指针地址,调用对应函数时,传入指针地址调用函数
  • 为什么这样,原先是在外部定义全局(静态变量),这样很不好,特别是在每个类对应参数不一样时有很大缺陷,在多线程处理时也不友好,上层应交由java管理
  • 这种方式还以替换原有的jni函数,方法重新映射关系

这个jni c++ 工程项目java代码对应如下

package org.img.processing;

import org.smirkcat.loaddll;

/**
 * @author smirklijie
 * @time 2016年7月7日17:27:05
 * @see 用于提供java调用c++接口例子
 */
public class ImgJni {
    //函数指针地址,linux64位指针地址为8字节,需要64位存储,需要init函数初始化
    public long ptrNative;
    
    public ImgJni(){
        ptrNative=init();
    }
    
    public ImgJni(String path){
        ptrNative=initPath(path);
    }
    /**
     * 实现图片的传图,返回相关信息
     * @param ptrNative
     * @param img
     * @return
     */
    public native String processing(long ptrNative,byte[] img);
    /**
     * 预留函数,初始化类和模型文件
     * @param path
     * @return
     */
    public native long initPath(String path);
    /**
     * 预留函数,初始化类
     * @return
     */
    public native long init();
    
    /**
     * 删除c++类,删除前确信不在调用,不然需重新执行init函数给ptrNative赋值
     * 只能执行一次,两次出错,内存释放只有一次
     * @return
     */
    public native void delete(long ptrNative);

    // 静态调用只执行一次,加载本地库 ,编译好的动态放到src/main/resources下面
    // 此处用了我的 项目loaddll来加载,可以用原生方法来加载s
    static {
        try {
            JarDllJava.loadLib("libimgjni", "/dll/", ImgJni.class);
            System.out.println("加载动态库imgjni完成");
        } catch (Exception e) {
            System.err.println("加载动态库imgjni失败,错误日志:" + e.getMessage());
        }
    }
}

对应c++ 关键代码请查看源文件

参考网址

空文件

简介

java调用c++自定义类,重写JNI_OnLoad实现 展开 收起
C++
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/smirkcat/ImgJni.git
git@gitee.com:smirkcat/ImgJni.git
smirkcat
ImgJni
ImgJni
master

搜索帮助