// 创建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