JNI调用的helloworld(JNI_OnLoad映射方式)
本示例展示JNI的基本示例,helloworld级别的,不过是用JNI_OnLoad映射的方式。
直接看代码,先看包含native method的Person.java的代码:
package helloworld; /**
* author : Zhou Shenshen
* date : 2016.7.16
* desc : It is a class to show how to use JNI.
* 演示调用JNI本地方法的写法和加载动态库
* email : zhouss@iPanel.cn
*/
public class Person{ /* Load the shared library libperson.so 加载C语言编写的动态库*/
static{
String classDir = Person.class.getResource("/").getPath();
System.load(classDir + "helloworld/libperson.so");
} /* Two native implemented by person.c 两个native method通过person.c来实现 */
public native void show();
public native void say(String content);
}
这里native method的定义不用多说,注意就是调用System的load时,传入的参数是库的全名,linux下包括lib和.so,而loadLibrary方法则是传入库的名字,没有前后缀。这里采用绝对路径定位和加载库,不用在设定库的参数。
接下来看person.c的代码:
#include <jni.h>
#include <stdio.h> /* Declare two function map to java native method 声明映射过来的本地函数 */
void native_show(JNIEnv * env,jobject obj);
void native_say(JNIEnv * env,jobject obj,jstring string); /* The array to map java method and c function 映射用的JNINativeMethod数组 */
static JNINativeMethod methods[] = {
{"show","()V",(void *)native_show},
{"say","(Ljava/lang/String;)V",(void *)native_say}
}; /* This function will be exec when libperson.so been loading. */
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){
JNIEnv * env = NULL;
jclass cls = NULL;
jint result = -;
if((*vm)->GetEnv(vm,(void **)&env,JNI_VERSION_1_6) != JNI_OK){
printf("err!!");
return JNI_ERR;
}
cls = (*env)->FindClass(env,"helloworld/Person"); //通过类路径字符串找到对应类
(*env)->RegisterNatives(env,cls,methods,sizeof(methods)/sizeof(JNINativeMethod));//调用RegisterNatives来注册本地方法,完成映射
return JNI_VERSION_1_6;
} /* Define the c native function. 本地方法映射过来的实现*/
void native_show(JNIEnv * env,jobject obj){
printf("hello!!\n");
}
void native_say(JNIEnv * env,jobject obj,jstring string){
const char * str = (*env)->GetStringUTFChars(env,string,); //将jstring转成c语言中的字符串。
printf("content : %s\n",str);
}
然后写个主函数测试JNI调用的情况:
package helloworld;
/**
* author : Zhou Shenshen
* date : 2016.7.16
* desc : As the entrance for the example.
* email : zhouss@iPanel.cn
*/
public class Main{
public static void main(String[] args){
Person p = new Person();
p.show();
p.say("I am XiaoMing!");
}
}
编译运行的脚本如下:
#!/bin/sh #test the libperson.so is exist.
if [ -e libperson.so ];then
#change to .. directory to run this example
cd ..
java helloworld.Main
exit ;
fi #Compiler *.java to *.class
javac Person.java Main.java
#Test the JAVA_HOME
if [ $JAVA_HOME != "" ]; then
#Compiler *.c to *.o,then link to shared library *.so.
gcc -fPIC -c -I$(echo $JAVA_HOME)/include/ -I$(echo $JAVA_HOME)/include/linux person.c
gcc -shared -o libperson.so person.o
#change to .. directory to run this example
cd ..
java helloworld.Main
exit
else
echo "JAVA_HOME is empty variable"
exit
fi
linux下bash下运行的结果如下:
hello!!
content : I am XiaoMing!
JNI调用的helloworld(JNI_OnLoad映射方式)的更多相关文章
- Android Jni 调用
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...
- Java JNI调用c语言的dll测试
最近复习C语言和java语言(10年没用了,温习一下),用JNI调用C语言的dll测试,以前没做过,在网上找了很多,总结如下: 环境:windows 10(64位) + JDK(32位,版本1.7.0 ...
- [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...
- Android Jni调用浅述
声明:欢迎转载,转载时请注明出处!http://blog.csdn.net/flydream0/article/details/7371692 1 简述 JNI是Java Native Interfa ...
- coco2dx jni 调用 java 相机返回 图片数据
新建 一个项目 名字:testJin 包名:com.TanSon.org python命令:python create_project.py -project testJin -package c ...
- java jni 调用c语言函数
今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...
- JAVA的JNI调用
由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分. 一般步骤: 先是写普通的Java类,其中包括本地方法调用. 然后编译这个Java类,调 ...
- HAL中通过JNI调用java方法【转】
转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...
- JAVA使用JNI调用C++动态链接库
JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -sha ...
随机推荐
- IOC:AutoFac使用demo
使用autofac 实现依赖注入 1.引用 autofac.dll 和 autofac.configuration.dll 2.新增接口 IDAL using System; using System ...
- MySQL——数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要的.MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 一.字符串类型: 字符串类型指CHAR.VARCHAR.B ...
- python 日期格式化常用标记
符号 说明 例子 %a 英文星期的简写 Mon %A 英文星期的完整编写 Monday %b 英文月份的简写 Jun %B 英文月份的完整编写 June ...
- Core Data 应用程序实践指南(Core Data 应用程序实践指南)
译者序 前言 勘误 1. 初次尝试Core Data应用程序 本书的基础,基本概念,能做什么,不能做什么.实现CoreDataHelper类,演示如何将Core Data同既有的应用程序相集成. 2. ...
- JavaScript中typeof和instanceof深入详解
这次主要说说javascript的类型判断函数typeof和判断构造函数原型instanceof的用法和注意的地方. typeof 先来说说typeof吧.首先需要注意的是,typeof方法返回一个字 ...
- js原生设计模式——9外观模式封装2(小型代码库YJ)
<script type="text/javascript"> //小型代码库YJ封装 var YJ = { //根据id获取元素 ...
- java中Integer比较需要注意的问题
java中Integer比较需要注意的问题 package com.srie.test; import java.util.HashMap; import java.util.Map; public ...
- HTML 颜色值
HTML 颜色值 颜色由红(R).绿(G).蓝(B)组成. 颜色值 颜色值由十六进制来表示红.绿.蓝(RGB). 每个颜色的最低值为0(十六进制为00),最高值为255(十六进制为FF). 十六进制值 ...
- Linux笔记(三) - 文件搜素
(1)文件搜索:find-name 根据文件名, *匹配任意字符 ,?单个字符-iname 根据文件名, 不区分大小写-size 根据文件大小查找 (+ 大于 -小于)(-a并且 -o或者)-us ...
- .net 开发经理的月薪
因为各人的成长不一样,有人工作了5年,技术也只能当个高级程序员,有人工作了两年,就能带领一个团队,有人在初中时期就写了一个很牛X 的框架,而我工作也快5年,也努力奋斗了5年,我觉得自己有能力做开发经理 ...