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文件

命令: javah -d ../jni -jni com.amn.JniSimple
com.amn.JniSimple:当前类的限定名。

image.png image.png
3.复制 .h头文件到cpp工程中,然后再c工程中添加这个头文件。
image.png

1.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");
    }

上一篇下一篇

猜你喜欢

热点阅读