JNI基础-C调用java方法
2020-02-20 本文已影响0人
伊泽瑞额
为了让自己更加熟悉开发流程,再把流程重新记录下。
1.打开eclipse 创建Java 工程 以C 获取java 的uuid 为例:创建本地方法
package com.amn;
import java.util.UUID;
public class JniSimple {
public static void main(String[] args) {
callStaticMethod();
}
private native static void callStaticMethod();
public static String getUUID() {
return UUID.randomUUID().toString();
}
static {
System.load();
}
}
2. 创建native 方法后 通过命令 进入项目的src 目录下生产头文件 刷新Java工程得到com_amn_JniSimple.h文件
image.png image.png命令: javah -d ../jni -jni com.amn.JniSimple
com.amn.JniSimple:当前类的限定名。
3.复制 .h头文件到cpp工程中,然后再c工程中添加这个头文件。
image.png1.c 工程中点击头文件 --添加—> 现有项 选中 .h文件,
2.复制jni.h 和jni_md.h文件到cpp工程中(这俩个文件再jdk 安装目录下) 我的是D:\JavaJdk\jdk1.8.0_31\include\win32
4.实现 .h文件声明的函数
#include "com_amn_JniSimple.h"
JNIEXPORT void JNICALL java_com_amn_JniSimple_callStaticMethod
(JNIEnv * env, jclass jclz){
//1. 调用getuuid 的static 方法
/*jobject(JNICALL *CallStaticObjectMethod) (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
CallStaticObjectMethod() 需要NIEnv *env, jclass clazz, jmethodID methodID, ... 这些参数
*/
//2.获取_jmethodID
jmethodID j_md = (*env)->GetStaticMethodID(env,jclz,"getUUID","()Ljava/lang/String");
jstring j_uuid=(*env)->CallStaticObjectMethod(env, jclz, j_md);
// jstring 转成 c 的 string
char * c_uuid=(*env)->GetStringUTFChars(env,j_uuid,NULL);
printf("c_uuid = %s",c_uuid);
}
5.生成一个dll 文件 给java 调用,进入配置管理器 因为是64操作系统选择64 平台
点击生成---->生成解决方案 从而生成dll文件
5 加载动态库
static {
System.load("D:/VisualStudio/work_place/NDK_02/x64/Debug/NDK_02.dll");
}