01.jni开发流程
2018-07-19 19:08
92 查看
前提
jni开发主要是指java调用c/c++方法,获取在c/c++中调用java方法,本次使用的开发工具是eclipse,请不要感觉用eclipse就不行了,其实会了eclipse,Android Studio用起来是一样的,对于c/c++的语言使用的是vs2013,没有下载的自己去搜索下载。
1.编写native方法
package com.gxl.jni; public class JniTest { //native方法 public native static String getStringFromC(); public static void main(String[] args) { String text = getStringFromC(); System.out.println(text); } }
2.javah命令,生成.h头文件
配置好jdk的环境变量,javah是jdk\bin\javah.exe
打开cmd命令行 cd 到当前项目下如 当前项目目录为 D:\EclipseWorkSpace\jni_01\src cd d: cd D:\EclipseWorkSpace\jni_01\src //接着使用javah生成相应的.h头文件 javah com.gxl.jni.JniTest //会生成相应的头文件,如果发生类找不到错误,则如下操作 //到项目的src根目录下,然后运行 set classpath=D:\EclipseWorkSpace\jni_01\src javah -jni com.gxl.jni.JniTest //可以如下命令 javah -classpath . -jni com.gxl.jni.JniTest //如果头文件是utf8编码格式的 javah -encoding UTF-8 -classpath . -jni com.gxl.jni.JniTest
生成的头文件 com_gxl_jni_JniTest.h 如下
/* DO NOT EDIT THIS FILE - it is machine generated */ //依赖jni.h #include <jni.h> /* Header for class com_gxl_jni_JniTest */ //如果没有定义则定义 #ifndef _Included_com_gxl_jni_JniTest #define _Included_com_gxl_jni_JniTest //如果是c++ #ifdef __cplusplus extern "C" { #endif /* * Class: com_gxl_jni_JniTest * Method: getStringFromC * Signature: ()Ljava/lang/String; */ //jstring 是返回类型 Java_包名_类名_方法名 JNIEXPORT jstring JNICALL Java_com_gxl_jni_JniTest_getStringFromC (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
3.复制.h头文件到CPP工程中
打开vs,新建项目jni01_study,然后将生成的头文件复制到项目目录下中
由于com.gxl.jni.JniTest.h 依赖jni.h 而jni.h 又依赖jni.md.h
所以还要将jni.h和jni.md.h一块复制到cpp项目中
jni.h和jni.md.h在jdk目录下,如我的地址如下:
jni.h在 F:\Program Files\Java\jdk1.8.0_161\include\jni.h jni.md.h在 F:\Program Files\Java\jdk1.8.0_161\include\win32\jni.md.h
通过如下方法将上面的三个 .h文件引入到项目中
添加现有项 将三个 .h 文件引入即可
4.实现.h头文件中声明的函数
接着新建01.c来实现头文件中的方法逻辑
//引用头文件 #include "com_gxl_jni_JniTest.h" //实现函数 JNIEXPORT jstring JNICALL Java_com_gxl_jni_JniTest_getStringFromC (JNIEnv * env, jclass jcl){ //JNIEnv 结构体指针 //env二级指针 //代表Java运行环境,调用Java中的代码 //简单的实现 //将C的字符串转为一个java字符串 //JNIEnv 在C++中就是一个结构体的别名 //env 在C++中一个结构体的一级指针 return (*env)->NewStringUTF(env,"c string"); }
5.生成 .dll
1.选中 debuge –> 配置管理器
修改如下
2.右键项目选中属性
修改如下
3.生成解决方案
6.配置dll的环境变量
这里有两种方式
第一种
将.dll的路径配置到电脑的环境变量的path路径中
第二种
也可以将.dll复制到eclipse项目的根目录下。
8.加载动态dll库
package com.gxl.jni; public class JniTest { public native static String getStringFromC(); public static void main(String[] args) { String text = getStringFromC(); System.out.println(text); } //加载动态库 static{ System.loadLibrary("jni01_study"); } }阅读更多
相关文章推荐
- JNI NDK (AndroidStudio+CMake )开发第一个项目的流程
- Android NDK 开发(一)JNI简介及调用流程
- jni开发流程
- Android NDK 开发(一)JNI简介及调用流程
- Android游戏开发实践(1)之NDK与JNI开发01
- JNI的开发流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- [黑莓开发之路][00][BlackBerry平台架构概述][08][数据传输流程][01][BES]
- !金尚网上商城-01、Web项目开发的一般流程》》02、分析与设计之架构分析与
- eclipse中的Jni开发流程(一)——基本开发
- 编程基础知识——Java JNI开发流程(2)
- NDK探究之旅《八》——jni的开发流程规范
- android jni开发流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- [置顶] Android Studio3.0开发JNI流程------JNI中字符串拼接的三种方式(C++)
- Android JNI 开发的流程
- Android JNI开发流程
- JNI开发流程
- Android JNI开发流程(android开发艺术探索随笔)
- Android的NDK开发(1)————Android JNI简介与调用流程