Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

feifa168/MyNativeCpp

Open more actions menu

Repository files navigation

简介

MyNativeCpp是一个为项目MyNativeJava提供native方法的动态库工程。

使用环境

  • 环境 win7 64位系统
  • java: IDEA 2018.1 + jdk1.8
  • c++ : CLion 2018.2 + mingw-w64
  • 依赖库及文件
    • %JAVA_HOME%\lib\jvm.lib
    • %JAVA_HOME%\include;%JAVA_HOME%\include\jni.h
    • %JAVA_HOME%\include;%JAVA_HOME%\include\win32\jni_md.h

模块

  • jni概述
  • native接口文件
  • 动态库提供本地方法
  • java使用本地方法

jni概述

待补充

参考

native接口文件

include目录下javah生成的接口文件,具体操作参见native接口生成

接口文件会逐步更新,主要用于测试

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

#ifndef _Included_com_ft_mynative_MyNativeJava
#define _Included_com_ft_mynative_MyNativeJava
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ft_mynative_MyNativeJava
 * Method:    fun
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_ft_mynative_MyNativeJava_fun
  (JNIEnv *, jobject);

/*
 * Class:     com_ft_mynative_MyNativeJava
 * Method:    fun2
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_ft_mynative_MyNativeJava_fun2
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_ft_mynative_MyNativeJava
 * Method:    fun3
 * Signature: ([Ljava/lang/Integer;)V
 */
JNIEXPORT void JNICALL Java_com_ft_mynative_MyNativeJava_fun3
  (JNIEnv *, jobject, jobjectArray);

#ifdef __cplusplus
}
#endif
#endif

动态库提供本地方法

CLion生成动态库,jdk是64位,原本使用的Mingw是32位程序,生成的dll在64位java程序中不能使用, 又下载了mingw64,配置使CLion使用64位mingw,CLion使用CMake编译程序。

CMakeList.txt

cmake_minimum_required(VERSION 3.12)
project(MyNativeJava)

set(CMAKE_CXX_STANDARD 14)

set(INC_DIR D:/java/jdk1.8.0_192/include;D:/java/jdk1.8.0_192/include/win32;../include)
set(LINK_DIR D:/java/jdk1.8.0_192/lib)
set(SOURCE_FILES com_ft_mynative_MyNativeJava.cpp com_ft_mynative_MyNativeJava.h)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../MyNativeJava")

include_directories(${INC_DIR})
link_directories(${LINK_DIR})
link_libraries(jvm jawt)

add_library(MyNativeJava SHARED com_ft_mynative_MyNativeJava.cpp com_ft_mynative_MyNativeJava.h)

生成的dll直接指定输出到MyNativeJava目录下,CMakeLists.txt中设置set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../../MyNativeJava"),需要MyNativeJava与MyNativeCpp放在一个目录下。 具体方法请参考源代码

java使用本地方法

详情参见java调用动态库

静态块加载dll

public class MyNativeJava {
    static {
        System.loadLibrary("libMyNativeJava");
    }
}

加载成功就可以使用native方法了,fun,fun2,fun3是测试用的几个方法,后续会加入更多内容,比如类成员修改,类方法执行等。 详情参见MyNativeJava.java

public class MyNativeJava {
    static {
        System.loadLibrary("libMyNativeJava");
    }

    private native void fun();
    private native int fun2(String s);
    private native void fun3(Integer[] ia);

    public static void main(String[] args) {
        MyNativeJava nativeHello = new MyNativeJava();
        nativeHello.fun();
        System.out.println(nativeHello.fun2("hello, tom"));
        nativeHello.fun3(new Integer[]{3, 5});
    }
}

About

MyNativeCpp是一个为项目MyNativeJava提供native方法的动态库工程。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  
Morty Proxy This is a proxified and sanitized view of the page, visit original site.