java调用c视频接口_JAVA本地调用(JNI- java调用c)

记录一下工作内容,对术语了解不多,暂且这样记着吧。

java调用c

一、写jni的步骤如下:

1.创建java类,定义接口函数,使用native修饰;

2.将java类编译成class;

3.将class编译成*.h头文件;

4.在c/c++中实现java定义的接口函数;

5.将该c/c++的实现导出动态链接库;

6.将动态链接库放到java的库路径;

7.使用。

二、应该注意的一些问题:

1.注意该java类所在的包,包会影响导出的头文件的名称,还会影响到头文件的生成;代码中不要出现中文;

2.使用javac将类编译成class文件,该文件会出现在java文件同一目录下;

3.使用javah将class文件编译成头文件,这一步需要注意,如果该类在某个包下,需要在src路径下进行编译,最后给出例子。

4.在c/c++中实现时注意java类型和c/c++类型间的转换,我遇到的是jstring转换成char*的问题。

对于如下函数

JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg

(JNIEnv *env, jobject o, jstring str)

{

}

如果是c实现,调用GetStringUTFChars时应该如下调用

const char *cstr = (*env)->GetStringUTFChars (env, str, NULL);

如果是c++实现,调用GetStringUTFChars时需要如下操作

const char *cstr = env->GetStringUTFChars (str, NULL);

5.build时指定导出dll,需要将%JAVA_HOME%\include和%JAVA_HOME%\include\win32包含到additional include directories;

6.在java中使用时只需要java的接口定义文件和导出的dll,具体使用时需要LoadLibrary,dll放在java.library.path下;

三、具体实现的例子

1.先是java文件,我的文件在com.bbwang包下!:

package com.bbwang;

public class JniTest

{

public native void printMsg(String str);

public native long add(int left, int right);

public native long minus(int left, int right);

} // class JniTest end

2.编译

找到src路径下

javac com\bbwang\JniTest.java 编译出class

javah com.bbwang.JniTest 编译出头文件,头文件在src目录下,名称是com_bbwang_JniTest.h,头文件内容贴出来:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_bbwang_JniTest */

#ifndef _Included_com_bbwang_JniTest

#define _Included_com_bbwang_JniTest

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_bbwang_JniTest

* Method: printMsg

* Signature: (Ljava/lang/String;)V

*/

JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg

(JNIEnv *, jobject, jstring);

/*

* Class: com_bbwang_JniTest

* Method: add

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_add

(JNIEnv *, jobject, jint, jint);

/*

* Class: com_bbwang_JniTest

* Method: minues

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_minus

(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus

}

#endif

#endif

4.c实现

#include

#include

#include "com_bbwang_JniTest.h"

/*

* Class: com_bbwang_JniTest

* Method: printMsg

* Signature: (Ljava/lang/String;)V

*/

JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg

(JNIEnv *env, jobject o, jstring str)

{

const char *cstr = (*env)->GetStringUTFChars (env, str, NULL);

fprintf (stdout, "from native method, msg = %s\n", cstr);

(*env)->ReleaseStringUTFChars (env, str, cstr);

}

/*

* Class: com_bbwang_JniTest

* Method: add

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_add

(JNIEnv *env, jobject o, jint left, jint right)

{

return left + right;

}

/*

* Class: com_bbwang_JniTest

* Method: minues

* Signature: (II)J

*/

JNIEXPORT jlong JNICALL Java_com_bbwang_JniTest_minus

(JNIEnv *env, jobject o, jint left, jint right)

{

return left - right;

}

5.导出dll

6.可以使用了

我将dll放到了%JAVA_HOME%\bin目录下,调用的文件内容如下:

package com.bbwang;

public class ForTest

{

static

{

System.loadLibrary("JniTest");

}

public static void main(String[] args)

{

// 不知道java.library.path在哪就直接打出来撒

// System.out.println(System.getProperty("java.library.path"));

System.out.println("test start");

JniTest jt = new JniTest();

jt.printMsg("native method start");

long result = jt.add(1,2);

System.out.println(result);

result = jt.minus(6,2);

System.out.println(result);

jt.printMsg("native method end");

}

} // class ForTest end

7.恩,可以看到结果了:

test start

3

4

from native method, msg = native method start

from native method, msg = native method end

结果还是比较神奇的,消息竟然是最后打出来的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 随机 数字 字母组合_java生成随机数字和字母组合

import java.util.Random;public String getCharAndNumr(int length){String val "";Random random new Random();for(int i 0; i < length; i){String charOrNum random.nextInt(2) % 2 0 ? "char" : "num"; // 输出字母还是数字if(&q…

java 声明抽象方法_java – 类必须声明为abstract或实现抽象方法错误

这是我的代码,假设在按下按钮时更改一些文本&#xff1a; –public class MyActivity extends ActionBarActivity {TextView txtview;Button butto;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.…

java socket 线程池_java socket编程的一个例子(线程池)

服务器程序EchoServer.java&#xff1b;import java.io.*;import java.net.*;import java.util.concurrent.*;public class EchoServer {private int port10000;private ServerSocket serverSocket;private ExecutorService executor;//线程池private final int pool_size4;pri…

java是值传递还是引用传递_Java 到底是值传递还是引用传递?

点赞、收藏还挺多&#xff0c;求一波关注------------------------------------------------------------没人邀请&#xff0c;自己强行回答一波。关于这个问题&#xff0c;引发过很多广泛的讨论&#xff0c;看来很多程序员对于这个问题的理解都不尽相同&#xff0c;甚至很多人…

java趣事_【趣事】Java程序员最年轻,C++程序员最年老

原标题&#xff1a;【趣事】Java程序员最年轻&#xff0c;C程序员最年老说起我们对编程世界现有的刻板印象&#xff0c;你一定听说过类似于没有人喜欢用Java编码或者使用C 都是老人家&#xff0c;等等这样的话。为了分析这些刻板印象背后的真相&#xff0c;Trestle Technology的…

koa2 mysql 中间件_Koa2 和 Express 中间件对比

koa2 中间件koa2的中间件是通过 async await 实现的&#xff0c;中间件执行顺序是“洋葱圈”模型。中间件之间通过next函数联系,当一个中间件调用 next() 后&#xff0c;会将控制权交给下一个中间件, 直到下一个中间件不再执行 next() 后, 将会沿路折返,将控制权依次交换给前一…

mysql 索引 内存_mysql索引【第三篇】

##innodb引擎的数据是按页为单位的&#xff0c;当需要读一条记录时&#xff0c;并不是将这个记录本身从磁盘中读取出来&#xff0c;而是以页为单位将整个页读取到内存中&#xff0c;每个页默认大小为16kb数据查询过程&#xff1a; 磁盘---->内存---->返回结果数据更新过…

python notebook配置_使用 Jupyter Notebook 配置 Stata\Python\Julia\R

作者&#xff1a;许梦洁 (中山大学)E-mail: xumj9mail2.sysu.edu.cn原文链接&#xff1a;磐石若水 → 使用 Jupyter Notebook 配置 Stata/Python/Julia/RStata 连享会   课程主页 || 直播视频 || 知乎推文扫码查看连享会最新专题、公开课视频和 100 多个码云计量仓库链接。早在…

qt 飞扬青云_Qt编写带频谱的音乐播放器

之前有个项目需要将音频文件的频谱显示出来&#xff0c;想了很多办法&#xff0c;后面发现fmod这个好东西&#xff0c;还是跨平台的&#xff0c;就一个头文件一个库文件就行&#xff0c;简单小巧功能强大&#xff0c;人家做的真牛逼。为了不卡住界面&#xff0c;采用了多线程处…

java什么是工作流程_springmvc工作流程是什么

springmvc工作流程是什么&#xff1a;1、springmvc工作原理图2、springmvc工作流程1、 用户向服务端发送一次请求&#xff0c;这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知&#…

java se入门_java SE 入门之运算符(第三篇)

在 java 中主要有以上运算符&#xff0c;分为 赋值运算符 &#xff0c;算术运算符、关系运算符(比较运算符),逻辑运算符和三目运算符(三元运算符).我们一起来学习下吧&#xff01;一、赋值运算符赋值运算符主要有五个、分别是 (赋值)、(加上一个在赋值)、-(减去一个在赋值)、*…

java 封闭实例_不能访问类型…的封闭实例

出于教育目的&#xff0c;我尝试制作一个服务器和一个客户端&#xff0c;其中服务器从多个客户端接收数据并回显每条消息。问题是&#xff0c;当我尝试让服务器一次将回显发送到所有客户端时。public class SocketServer {ArrayList ts new ArrayList();ServerSocket serv;sta…

java接口权限管理在哪里_JAVA-访问权限控制

以前对于public、private、protect、default&#xff0c;都只是简单的知道其对应的访问权限范围&#xff0c;现在看了think in java中的描述&#xff0c;讲了这几种访问权限在什么场景下使用&#xff0c;觉得进一步的了解的它存在的意义和合理性。因为在我们的日常开发中&#…

java 重写session_使用Shiro重写Session 自定义SESSION

引入shiro的jar包1.2.3org.apache.shiroshiro-core${shiroVersion}org.apache.shiroshiro-web${shiroVersion}org.apache.shiroshiro-ehcache${shiroVersion}org.apache.shiroshiro-spring${shiroVersion}配置shiro(web.xml)shiroFilterorg.springframework.web.filter.Delegat…

java7最后战线_我的世界最后战线2.0整合包

我的世界1.7.2最后战线The end battle line正式V2修复版是我的世界最后战线2.0整合包。游戏信息地图名字: The End Battle Line「正式版」地图分类: 其他地图类型: 存档地图版本: 后期Anvil格式(1.3)游戏介绍>>前言<<经过了半学期加整整大半个暑假的努力&#xff0…

js添加多marker 高德地图_覆盖物-参考手册-地图 JS API | 高德地图API

覆盖物覆盖物是指叠加在地图底图之上的一些常见要素&#xff0c;包括Marker类点标记。 构造函数 说明AMap.Marker( 构造一个点标记对象&#xff0c;通过MarkerOptions设置点标记对象的属性MarkerOptions 类型 说明map 要显示该marker的地图对象position 点标记在地图上显示的位…

java敏感异常是什么_java中的异常是什么?

Throwable(所有error和exception的父类:超类)Java将错误变成对象交给异常处理机制Error(仅靠程序本身无法恢复的严重错误)一般是环境的问题&#xff0c;JVM的问题&#xff0c;并非程序的问题&#xff1b;最典型的就是虚拟机中运行的程序过多&#xff0c;造成的虚拟机内存溢出&a…

java为什么不推荐使用stack_栈和队列的面试题Java实现,Stack类继承于Vector这两个类都不推荐使用...

在 thinking in java中看到过说Stack类继承于Vector&#xff0c;而这两个类都不推荐使用了&#xff0c;但是在做一到OJ题时&#xff0c;我用LinkedList来模拟栈和直接用Stack&#xff0c;发现在进行入栈出栈操作时Stack的速度竟然还快一点然而需要多线程的时候有Collections.sy…

reducebykeyandwindow java_Spark Streaming笔记整理(三):DS的transformation与output操作

[TOC]DStream的各种transformationTransformation Meaningmap(func) 对DStream中的各个元素进行func函数操作&#xff0c;然后返回一个新的DStream.flatMap(func) 与map方法类似&#xff0c;只不过各个输入项可以被输出为零个或多个输出项filter(func) 过滤出所有函数func返回值…

java mysubmail_关于MyBatis10种超好用的写法(收藏)

用来循环容器的标签forEach,查看例子foreach元素的属性主要有item&#xff0c;index&#xff0c;collection&#xff0c;open&#xff0c;separator&#xff0c;close。item&#xff1a;集合中元素迭代时的别名index&#xff1a;集合中元素迭代时的索引open&#xff1a;常用语w…