本示例展示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. .Net普通三层 到 工厂模式->线程内唯一+单元工作模式->WebService分布式三层

    在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一 ...

  2. UVa 11747 - Heavy Cycle Edges

    题目大意:计算最小生成树有两种算法:一种是kruskal算法,另一种是与之相反的:如果图中存在环,去掉权重最大的边,直到不存在环.输出去掉的那些边. 可以用kruskal算法解决,在判断一条边时如果加 ...

  3. CSS border三角、圆角图形生成技术简介

    http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题, ...

  4. 建立ipython集群

    启动controller ipcontroller -- ip = ipaddress 设置ssh免登陆 因为需要分发文件,采用ssh通信,所以需要配置ssh免登陆 分发配置文件 scp contro ...

  5. 【WebService】WebService学习笔记

    WebService三要素 WebService三要素SOAP(Simple Object Access Protocol).WSDL(WebServicesDescriptionLanguage). ...

  6. 利用DIV+CSS制作网页过程中常用的基本概念及标签使用细节

    CSS主要用于对HTML文件功能的补充及扩展,其作用就是对HTML文件中各种排版进行设置,达到对网页中字体.颜色.背景.图片等的控制,使网页能够完全依照设计者的想法来显示. CSS可以控制网页的显示, ...

  7. Flex性能调优相关的一些总结

    1.Performace包含4点:(1)Latency反应时间(2)Scalability:可伸缩性(3)Reliablity:稳定性(4)Availability:可用性2.运行时生命周期:Flex ...

  8. Asp.net mvc 知多少(三)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  9. SQL索引--基础理论

    1.索引的定义 索引是数据库表中一列或多列的值进行的一种排序,用于快速找出在某一列中特定的值. 2.索引的原理 如果不使用索引,则通常的查询数据中,需要对表中数据做一一对应的比较,直到找出所有相关的行 ...

  10. java工程打包成jar包,并且解压lib里的jar包

    在我们开发完java工程部署时,有时不需要web容器,为了方便部署有时候需要打成jar包. 这里介绍2种Eclipse打jar包的方式, 方式一.工程引用的jar包打在lib目录下 1.工程上右键,E ...