一、准备包含本地方法的.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用法小例子的更多相关文章

  1. oracle的loop等循环语句的几个用法小例子

    --loop循环用法 (输出1到10) declare v_num number(2) := 0; begin loop v_num := v_num + 1; exit when v_num > ...

  2. oracle的loop等循环语句的几个用法小例子[转]

    --loop循环用法 (输出1到10) declare v_num number(2) := 0; begin loop v_num := v_num + 1; exit when v_num > ...

  3. video,audio用法小例子

    用此小程序设计播放/暂停,放大缩小 <!DOCTYPE html> <html> <body> <div style="text-align:cen ...

  4. vector 用法小例子

    1. vector<int> vec; vec.push_back(1); 2. vector<int> vec(10); vec[0] = 1;

  5. GROUP BY、HAVING、AS 的用法小例子

    需求: 查询选休了5门课程的学生的姓名 分析: 1. 先从 t_sc 表中查出 选了5门课的学生的学号: SELECT COUNT(code) AS countCourse,sid FROM t_sc ...

  6. map用法小例子

    一. Map< Key , Value > m_Eg; 一般赋值表示成: TypeElem  value; m_Eg[key]  =  value; 或 m_Eg.insert(make_ ...

  7. 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子

    原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...

  8. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  9. liferay MVCActionCommand的用法及例子

    在liferay7中把portlet中的控制层拆成了3个部分: 1.MVCActionCommand 2.MVCRenderCommand 3.MVCRecourceCommand 至于为什么要拆出来 ...

随机推荐

  1. javaScript中this到底指向谁

    1.前言 在JavaScript中,this的指向一直是大多数初学者的易错点,总是搞不清楚this到底指向谁,而在求职面试中,this的指向问题往往又是高频考点.本篇博文就来总结一下在JavaScri ...

  2. 『图论』LCA最近公共祖先

    概述篇 LCA(Least Common Ancestors),即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先. LCA可分为在线算法与离线算法 在线算 ...

  3. Docker 学习 | 基础命令

    基本概念定义 基本组成 客户端/守护进程 C/S架构 本地/服务器 镜像 容器基石 只读文件系统 联合加载(union mount) 容器 通过镜像启动 执行 写时复制 仓库 公有 docker hu ...

  4. Mac下配置nacos开机启动

    nacos能正常启动后,开始制作启动app. 1.打开自带的 自动操作 2.点击选项 3.选择应用程序 4.搜索shell,点击运行Shell脚本,写入脚本,$NACOS 为nacos的绝对路径,保存 ...

  5. jdk8 函数式编程概念

    yls 2019/11/7 函数式接口 如果一个接口只有一个抽象方法,那么该接口就是函数式接口 如果我们在某接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义来 ...

  6. 用正则表达式获取URL中的查询参数

    总结获取url中查询参数的两种方式 通过正则表达式获取单个参数 url中的所有查询参数可以通过 window.location.search 字段获取,以字符串的形式返回.并有固定的格式 ?param ...

  7. Arduino 将 String 转化为 int

    Arduino 将 String 转化为 int 函数:toInt() 实例: String my_str = "; int my_int = my_str.toInt();

  8. nyoj 524-A-B Problem (java stripTrailingZeros, toPlainString)

    524-A-B Problem 内存限制:64MB 时间限制:1000ms 特判: No 通过数:2 提交数:4 难度:3 题目描述: A+B问题早已经被大家所熟知了,是不是很无聊呢?现在大家来做一下 ...

  9. NetCore基于EasyNetQ的高级API使用RabbitMq

    一.消息队列 消息队列作为分布式系统中的重要组件,常用的有MSMQ,RabbitMq,Kafa,ActiveMQ,RocketMQ.至于各种消息队列的优缺点比较,在这里就不做扩展了,网上资源很多. 更 ...

  10. 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper)

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...