# mechanical-arm **Repository Path**: shenmk/mechanical-arm ## Basic Information - **Project Name**: mechanical-arm - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-10 - **Last Updated**: 2021-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README • java是一种跨平台的语言,基于jvm虚拟机运行,因为jvm本身对于操作系统来说就是应用程序,在程序空间里跑别的应用会有很多限制。所以 基于JNI的跨语言调用应运而生,JNI是java的一套标准,一般来说是使用java程序调用C/C++实现对操作系统的操作或者追求更高的效率。 • 今天看了大半天的JNI调用,在这里写一下自己的案例和遇到的坑. 项目地址: 1. JAVA类和方法示例 //Java2cpp.java // 包名,可以忽略,注意 java 中对包名的要求 package com.hebust.jni; public class Java2cpp { static { // 调用动态链表库 dll System.loadLibrary("Java2cpp"); } // native 关键字修饰的方法为其他语言实现 public native int dLLADD(int a, int b); //测试用例主函数 // 当然,static 内的所有代码,方法可以独立出来,让Java2cpp仅作为jni接口 public static void main(String[] var0) { Java2cpp var2 = new Java2cpp(); int var3 = var2.dLLADD(2, 4); System.out.println("Java call cpp dll result:" + var3); } } 1. 编译java代码,得到 Java2cpp.class: javac Java2cpp.java 2. 根据class文件生成动态链表库生命 *.h javah com.hebust.jni.Java2cpp ---------------------------------- 这一步需要特别注意,在java的规则里,包名=文件夹层级,由于Java2cpp的包为 com.hebust.jni,所以你应该在上级文件夹, com的上级(如java)执行javah指令,【其实执行 java运行时也是如此】 ---------------------------------------------- 3. 生成的 *.h 如下 ,【不要修改】 /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class com_hebust_jni_Java2cpp */ #ifndef _Included_com_hebust_jni_Java2cpp #define _Included_com_hebust_jni_Java2cpp #ifdef __cplusplus extern "C" { #endif /* * Class: com_hebust_jni_Java2cpp * Method: dLLADD * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_hebust_jni_Java2cpp_dLLADD (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif 2. 下面开始新建 VC++工程, a. 打开 visual studio 2019新建C++项目,如果没有C++选项请自行下载相关库 ⅰ. b. 直接下一步,名称随意写(注意项目名就是编译、调试后的文件名),选择新项目 ⅰ. c. 打开项目所在的文件夹,将 *.h文件拷贝进去 ⅰ. ⅱ. 选择头文件 > 添加 > 现有项 ,选择原来的 *.h 加入,发现有报错 ⅲ. 修复报错> 创建一个新的 类 文件,选择原来的 *.h 1. ⅳ. 在项目上点击 扳手 进入配置页面,配置 C/C++,附加包含目录,吧jdk的 include文件夹和include/win32都加进来 D:\java\你的jdk路径\include;D:\java\你的jdk路径\include\win32;%(AdditionalIncludeDirectories) 1. a. 报红的问题已经解决,接下来皆可以写 *.h的实现了 ⅰ. 新建的cpp包含进原有的头文件,可以直接在头文件选择实现 1. #include "com_hebust_jni_Java2cpp.h" 2. 写好头文件的函数实现,点击生成即可得到对应的dll文件 a. b. idea配置库文件为 C++项目的release目录即可调用,注意平台对应 ⅰ. c. 运行java函数输出结果,成功调用 ----------------------------------------------------------------------------------------------------------------------- a. 可能遇到的问题: ⅰ. java.lang.UnsatisfiedLinkError: com.hebust.jni.Java2cpp.DLL_ADD(II)I 1. 名称不匹配,在java命名中尽可能遵循java对方,小驼峰命名,避免下划线 ⅱ.