首先创建一个java类文件,封装一个native函数和一个用于回调的函数
package
jni;
public
class
Log
{
static{
System.loadLibrary(“mylib“);
}
//用来回调,输出c代码层的信息
public void output(String out){
System.out.println(out);
}
//native函数,用来传递对象
public native void test(Log log);
public static void main(String[] args){
Log log = new Log();
log.test(log);
}
}
调用javah命令,生成对应的c/c++都文件
/* DO NOT EDIT THIS FILE – it is machine generated */
#include
<
jni.h
>
/* Header for class jni_Log */
#ifndef _Included_jni_Log
#define _Included_jni_Log
#ifdef __cplusplus
extern
“
C
“
{
#endif
/*
* Class: jni_Log
* Method: test
* Signature: (Ljni/Log;)V
*/
JNIEXPORT void JNICALL Java_jni_Log_test
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
利用vc和生成的头文件完成一个dll
#include
<
windows.h
>
#include
“
jni_Log.h
“
int
WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReasion,PVOID pvReserved)
{
return TRUE;
}
JNIEXPORT
void
JNICALL Java_jni_Log_test(JNIEnv
*
env, jobject obj, jobject log)
{
jclass cls = (*env)->GetObjectClass(env, log);
jmethodID jmid = (*env)->GetMethodID(env, cls, “output“, “(Ljava/lang/String;)V“);
jstring info = (*env)->NewStringUTF(env, “i am a error!“);
(*env)->CallVoidMethod(env,log, jmid,info);
(*env)->ReleaseStringUTFChars(env,info,(*env)->GetStringUTFChars(env, info, FALSE));
}
编译完成后,将mylib.dll放到与jni同级的目录中,运行命令java jni.Log,即可看到控制台成功打印信息
“i am a error!“。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100529.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...