本示例展示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映射方式)的更多相关文章

  1. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

  2. Java JNI调用c语言的dll测试

    最近复习C语言和java语言(10年没用了,温习一下),用JNI调用C语言的dll测试,以前没做过,在网上找了很多,总结如下: 环境:windows 10(64位) + JDK(32位,版本1.7.0 ...

  3. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  4. Android Jni调用浅述

    声明:欢迎转载,转载时请注明出处!http://blog.csdn.net/flydream0/article/details/7371692 1 简述 JNI是Java Native Interfa ...

  5. coco2dx jni 调用 java 相机返回 图片数据

    新建 一个项目 名字:testJin  包名:com.TanSon.org  python命令:python create_project.py -project testJin -package c ...

  6. java jni 调用c语言函数

    今日在hibernate源代码中遇到了native关键词,甚是陌生,就查了点资料,对native是什么东西有了那么一点了解,并做一小记. native关键字说明其修饰的方法是一个原生态方法,方法对应的 ...

  7. JAVA的JNI调用

    由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分. 一般步骤: 先是写普通的Java类,其中包括本地方法调用.  然后编译这个Java类,调 ...

  8. HAL中通过JNI调用java方法【转】

    转载请注明本文出处:http://www.cnblogs.com/xl19862005 作者:Xandy 由于工作的需要,最近一直在研究HAL.JNI.Java方法之间互调的问题,并做了如下一些记录和 ...

  9. JAVA使用JNI调用C++动态链接库

    JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -sha ...

随机推荐

  1. Servlet添加

    index .jsp <body> <h1>第一个Servlet</h1> <hr> <a href = "servlet/Hellos ...

  2. C++ CRTP singleton

    C++ CRTP 是个很有意思的东西,因为解释原理的文章很多,但是讲怎么用的就不是很多了. 今天就稍微写下CRTP(奇异递归模板模式)的一个有趣的用法:Singleton(单例模式) 单例有很多中写法 ...

  3. GitHub优秀的Android 开源项目

    GitHub上优秀Android开源项目 转载自 : http://my.eoe.cn/sisuer/archive/3348.html http://my.eoe.cn/sisuer/archive ...

  4. Android px、dp和sp单位区别

    [转]http://www.cnblogs.com/bjzhanghao/archive/2012/11/06/2757300.html 在调整布局的时候,某些控件的大小需要设置单位: px: 即像素 ...

  5. windowsxp系统下SVN添加新用户

    以我部署的文件为例: 我在f盘下新建一个zzz文件夹将其部署为svn共享工程后,新来员工需要添加svn账号以获取工程. 总共三步begin: 1.进入工程文件夹ZZZ在里面有一个conf文件夹如图: ...

  6. C # 产生鼠标点击事件

    新建一个WinFrom,找到MouseDown,回车,生成代码如下点击的效果如图 参考文章:http://blog.csdn.net/u012842807/article/details/454143 ...

  7. CSS中设置margin:0 auto; 水平居中无效的原因分析

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题,margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应,其 ...

  8. Tomcat配置全攻略

    tomcat的的下载地址http://www.apache.org/dist/jakarta/tomcat-4/ 1.安装jdk,详细操作请参考本站windows 2k和redhat 8.0下java ...

  9. MyBatis java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符

    http://blog.sina.com.cn/s/blog_6da7fcff0101jewf.html 查看SQL语句是否多加了分号";"

  10. Hadoop学习笔记-001-CentOS_6.5_64_连接外网设置

    参考:http://blog.csdn.net/u010270403/article/details/51444677 虚拟机中共五个centos系统,每个系统有两个用户root和hadoop:cdh ...