JNI用法小例子
一、准备包含本地方法的.java文件(ContentVideo.java),包括set()和get()两个方法。
public class ContentVideo { public native static String get(); //对将要调用的方法做本地声明
public native static void set(int i);static
{
System.loadLibrary("InputFormatSo"); //在类中声明所调用的库名称
} }
二、生成对应的.h文件
javah -jni ContentVideo
三、根据ContentVideo.h文件,编写自己的ContentVideo.cpp文件,ContentVideo.cpp内容如下:
#include "ContentVideo.h"
#include <string>
#include<string.h>
using namespace std;
int i = ;
//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, , strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
} JNIEXPORT jstring JNICALL Java_ContentVideo_get
(JNIEnv* env, jclass) {
if(i >= && i < ) {
return stoJstring(env, "bad");
}
else if(i >= && i < ) {
return stoJstring(env, "ok");
}
else if(i >= && i <= ) {
return stoJstring(env, "good");
}
else {
return stoJstring(env, "input data is wrong");
}
} JNIEXPORT void JNICALL Java_ContentVideo_set
(JNIEnv *, jclass, jint m) { i = m;
}
四、编译.cpp文件,生成对应的.so文件,即libInputFormatSo.so
Makefile文件内容如下:
g++ -o libInputFormatSo.so ContentVideo.cpp -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -fPIC -shared
sudo cp libInputFormatSo.so /usr/lib #把libInputFormatSo.so加到java.library.path路径下
五、编写Java主程序文件(ContentMain.java),该程序会调用含有本地方法的Java类ContentVideo,主程序如下:
public class ContentMain { public static void main(String[] args) {
ContentVideo.set(Integer.parseInt(args[0]));
System.out.println(ContentVideo.get());
}
}
六、编译ContentMain.java并运行类ContentMain
javac ContentMain.java
java ContentMain
最终程序输出结果:bad
JNI用法小例子的更多相关文章
- oracle的loop等循环语句的几个用法小例子
--loop循环用法 (输出1到10) declare v_num number(2) := 0; begin loop v_num := v_num + 1; exit when v_num > ...
- oracle的loop等循环语句的几个用法小例子[转]
--loop循环用法 (输出1到10) declare v_num number(2) := 0; begin loop v_num := v_num + 1; exit when v_num > ...
- video,audio用法小例子
用此小程序设计播放/暂停,放大缩小 <!DOCTYPE html> <html> <body> <div style="text-align:cen ...
- vector 用法小例子
1. vector<int> vec; vec.push_back(1); 2. vector<int> vec(10); vec[0] = 1;
- GROUP BY、HAVING、AS 的用法小例子
需求: 查询选休了5门课程的学生的姓名 分析: 1. 先从 t_sc 表中查出 选了5门课的学生的学号: SELECT COUNT(code) AS countCourse,sid FROM t_sc ...
- map用法小例子
一. Map< Key , Value > m_Eg; 一般赋值表示成: TypeElem value; m_Eg[key] = value; 或 m_Eg.insert(make_ ...
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...
- c# BackGroundWorker 多线程操作的小例子
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- liferay MVCActionCommand的用法及例子
在liferay7中把portlet中的控制层拆成了3个部分: 1.MVCActionCommand 2.MVCRenderCommand 3.MVCRecourceCommand 至于为什么要拆出来 ...
随机推荐
- 文字转换为svg动画
将输入文本根据使用字体转化为描边动画. 详情请看git https://oubenruing.github.io/svg-text-animate/
- 来,我们手写一个简易版的mock.js吧(模拟fetch && Ajax请求)
预期的mock的使用方式 首先我们从使用的角度出发,思考编码过程 M1. 通过配置文件配置url和response M2. 自动检测环境为开发环境时启动Mock.js M3. mock代码能直接覆盖g ...
- mysql General error: 1366 Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' for column 'dianpumiaoshu' at row 1 解决方法
mysql General error: 1366 Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...' for column 'dianpumi ...
- python——切片
切片 格式:[start : end : step] start:起始索引,从0开始,-1表示结束 end:结束索引 step:步长 # 字符串,列表,元组等都可以支持切片截取的操作# 切片必须依赖于 ...
- 使用火狐浏览器模仿手机浏览器,附浏览器HTTP_USER_AGENT汇总
HTTP_USER_AGENT用来获取浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)和用户个人偏好. 改变浏览器的这个参数就可以伪装成相应的浏览器. User Agent Swit ...
- 微服务SpringCloud之GateWay熔断、限流、重试
纯洁的微笑的Spring Cloud系列博客终于学完了,也对Spring Cloud有了初步的了解. 修改请求路径的过滤器 StripPrefix Filter 是一个请求路径截取的功能,我们可以利用 ...
- FreeSql v0.11 几个实用功能说明
FreeSql 开源发布快一年了,立志成为 .Net 平台方便好用的 ORM,仓库地址:https://github.com/2881099/FreeSql 随着不断的迭代更新,越来越稳定,也越来越强 ...
- 高性能Web动画和渲染原理系列(5)合成层的生成条件和陷阱
目录 一. 硬件加速相关的几个概念 二. 合成层的生成条件 显式提升 隐式提升 三. 硬件加速的权衡 四. 动画实现的一些建议 示例代码托管在:http://www.github.com/dashno ...
- Typescript I: 遍历Array的方法:for, forEach, every等
Typescript的官方文档 Iterators and Geneators (https://www.typescriptlang.org/docs/handbook/iterators-and- ...
- Python字符串类型判断错误
Python里面常用的字符串类型有str和unicode,如果要判断一个对象的类型,最好用basestring,否则可能会判断错误: str1 = "hello" str2 = u ...