Java调用c++ DLL

22 篇文章 0 订阅

// 创建HelloTest.java文件,添加 public native int DLL_ADD(int a,int b);
//cd到HelloTest.java文件所在目录
//执行命令javac HelloTest.java,即生成HelloTest.class
//执行命令javah Java2cpp生成Java2cpp.h头文件
import java.lang.reflect.Field;

public class HelloTest {

    public native int DLL_ADD(int a,int b);  //加

    public static void main(String[] args) {

        //设置DLL 的路径
       System.setProperty("java.library.path",  System.getProperty("java.library.path")+";E:\\JavaProject\\Hello\\src\\main\\lib");
        Field fieldSysPath = null;
        try {
            fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println( System.getProperty("java.library.path"));
        //加载DLL
       System.loadLibrary("Hello1");

        HelloTest test = new HelloTest();

        int sum=test.DLL_ADD(2,4);
        System.out.println(sum);

    }

}

// 创建HelloTest.java文件,添加 public native int DLL_ADD(int a,int b);
//cd到HelloTest.java文件所在目录
//执行命令javac HelloTest.java,即生成HelloTest.class
//执行命令javah Java2cpp生成Java2cpp.h头文件



//c++需要包含生成的HelloTest.h ,不然会报下面错误
//Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloTest.DLL_ADD(II)I

新建DLL 库空项目

添加hello1.cpp

#include <iostream>
// "HelloTest.h"是java生成的
#include "HelloTest.h"

int DLL_API_ADD(int a, int b)
{
	return (a + b);
}

JNIEXPORT jint JNICALL Java_HelloTest_DLL_1ADD(JNIEnv* env, jobject obj, jint a, jint b) {
	int var = 0;
	var = DLL_API_ADD(a, b);
	return var;
}

//新建DLL 库空项目

//附加包含目录 要添加
//D:\Program Files\Java\jdk1.8.0_101\include
//D:\Program Files\Java\jdk1.8.0_101\include\win32
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloTest */

#ifndef _Included_HelloTest
#define _Included_HelloTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloTest
 * Method:    DLL_ADD
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_HelloTest_DLL_1ADD
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

-------------------------------------

c++回调 java

创建接口

public interface HelloWorld {
    //回调函数
    public void sayHello(String str);

}

修改 HelloTest

import java.lang.reflect.Field;

public class HelloTest {

    public native int DLL_ADD(int a,int b);  //加

    public static native void JniHelloWorld(HelloWorld callback);

    public  native void testCall();

    public static void main(String[] args) {

        //设置DLL 的路径
       System.setProperty("java.library.path",  System.getProperty("java.library.path")+";E:\\JavaProject\\Hello\\src\\main\\lib");
        Field fieldSysPath = null;
        try {
            fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
            fieldSysPath.setAccessible(true);
            fieldSysPath.set(null, null);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        System.out.println( System.getProperty("java.library.path"));
        //加载DLL
       System.loadLibrary("Hello1");

        HelloTest test = new HelloTest();

        int sum=test.DLL_ADD(2,4);
        System.out.println(sum);

        System.out.println("--------回调--------------");

        //JniHelloWorld c++函数
        HelloTest.JniHelloWorld(new HelloWorld() {
            //回调
            public void sayHello(String str){

                System.out.println(str);

            }

        });

        test.testCall();

    }



}

// 创建HelloTest.java文件,添加 public native int DLL_ADD(int a,int b);
//cd到HelloTest.java文件所在目录
//执行命令javac HelloTest.java,即生成HelloTest.class
//执行命令javah HelloTest生成HelloTest.h头文件



//c++需要包含生成的HelloTest.h ,不然会报下面错误
//Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloTest.DLL_ADD(II)I

重新生成 HellTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloTest */

#ifndef _Included_HelloTest
#define _Included_HelloTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloTest
 * Method:    DLL_ADD
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_HelloTest_DLL_1ADD
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     HelloTest
 * Method:    JniHelloWorld
 * Signature: (LHelloWorld;)V
 */
JNIEXPORT void JNICALL Java_HelloTest_JniHelloWorld
  (JNIEnv *, jclass, jobject);

/*
 * Class:     HelloTest
 * Method:    testCall
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloTest_testCall
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

修改 hello1.cpp

#include <iostream>
// "HelloTest.h"是java生成的
#include "HelloTest.h"

jmethodID javaCallback;
JNIEnv* g_env;
jobject g_obj;

int DLL_API_ADD(int a, int b)
{
	return (a + b);
}

JNIEXPORT jint JNICALL Java_HelloTest_DLL_1ADD(JNIEnv* env, jobject obj, jint a, jint b) {
	int var = 0;
	var = DLL_API_ADD(a, b);

	


	return var;
}

JNIEXPORT void JNICALL Java_HelloTest_JniHelloWorld(JNIEnv* env, jclass jc, jobject obj)
{
	g_env = env;
	g_obj = obj;
	jclass javaClass = env->GetObjectClass(obj);//获得类对象
	if (javaClass == NULL) {

		printf("Fail to find javaClass\r\n");

	}
	else {

		 javaCallback = env->GetMethodID(javaClass, "sayHello", "(Ljava/lang/String;)V");//获得类方法,千万别忘记;号

		if (javaCallback == NULL) {

			printf("Fail to find jmethodID");

		}
		else {

			jstring str = env->NewStringUTF("Welcome to C++ Callback Java");//封装

			env->CallVoidMethod(obj, javaCallback, str);//调用方法
		}

	}
}

JNIEXPORT void JNICALL Java_HelloTest_testCall(JNIEnv*, jobject)
{
	jstring str = g_env->NewStringUTF("save callback to call again");//封装

	g_env->CallVoidMethod(g_obj, javaCallback, str);//调用方法

}



//新建DLL 库空项目

//附加包含目录 要添加
//D:\Program Files\Java\jdk1.8.0_101\include
//D:\Program Files\Java\jdk1.8.0_101\include\win32

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值