本博文要做两件事
1:怎样将c文件编译成lib*.so
2:java同c语言文件如何传递返回数据类型

现在开始搞起:

  • 1:怎样将c文件编译成lib*.so
    Linux下编译共享库时,必须加上-fPIC参数,否则在链接时会有错误提示。故而我们的编译就变成了
gcc -fPIC -shared -o libnative.so native.c

但是呢有提示说找不到jni.h 的路径,那么咱们给gcc编译制定路径呗

gcc -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/include/ -fPIC -shared -o libnative.so native.c

呶完美。我们有了c语言的动态库。我们运行java JNIDemo的时候仍旧报错。no native in java.library.path这是因为我们没有给制定库的路径。

export LD_LIBRARY_PATH=.

加上这一个就可以了。
OK解决掉第一个见过就会,看过就忘的知识点。下面开始真正恶心人的地方。

  • 2 java同c语言文件如何传递返回数据类型

从实用的角度,我准备在这部分投机取巧。我就记住传递字符串,传递数组,传递基本类型数据。这三类。然后用到了我就来这儿扒代码。本着这个思想幸福的贴代码吧!!

  1. 传递基本类型数据(直接使用,直接返回)
jint c_hello(JNIEnv *env, jobject cls, jint m)
{printf("Hello, world! val = %d\n", m);return 100;
}static const JNINativeMethod methods[] = {{"hello", "(I)I", (void *)c_hello},
};

贴关键部分。
2. 传递为字符串

jstring JNICALL c_hello(JNIEnv *env, jobject cls, jstring str)
{//printf("this is c : %s\n", str);//return "return from C";const jbyte *cstr;cstr = (*env)->GetStringUTFChars(env, str, NULL);if (cstr == NULL) {return NULL; /* OutOfMemoryError already thrown */}printf("Get string from java :%s\n", cstr);(*env)->ReleaseStringUTFChars(env, str, cstr);return (*env)->NewStringUTF(env, "return from c");
}static const JNINativeMethod methods[] = {{"hello", "(Ljava/lang/String;)Ljava/lang/String;", (void *)c_hello},
};

3.传递的数组类型

jint c_hello(JNIEnv *env, jobject cls, jintArray arr)
{jint *carr;jint i, sum = 0;carr = (*env)->GetIntArrayElements(env, arr, NULL);if (carr == NULL) {return 0; /* exception occurred */}for (i=0; i< (*env)->GetArrayLength(env, arr); i++) {sum += carr[i];}(*env)->ReleaseIntArrayElements(env, arr, carr, 0);return sum;
}static const JNINativeMethod methods[] = {{"hello", "([I)I", (void *)c_hello},
};

阔以了,万事大吉。
接下来的博客安排,先不去写异常 还有 c调用java部分。我记不住,什么时候用到的时候我再补充这个系列。接下来进行反射和内部类的知识补充。

JAVA进阶day07JNI(java调用c)B部分相关推荐

  1. JAVA进阶day07JNI(java调用c)A部分

    目前接触的JNI有java调用c和c调用java两类.其中java调用c又有隐式和显示两种映射关系.本笔记针对java调用c的显示映射.本着工程实际够用的原则,不够再回头来补充. JAVA访问c库需要 ...

  2. [java进阶]1.Java读取txt文件和写入txt文件

    1. Java读取txt文件 import java.io.*; import java.util.ArrayList; import java.util.List;public class unit ...

  3. Java进阶:java程序设计慕课版课后答案浪潮优派

    摘要 Spring框架自诞生来就备受开发者青睐,很多开发者一致认为它是目前最屌的Java项目,正是因为它的"过人之处",市面上99%的企业都在使用Spring框架. 所以,Spri ...

  4. 【Java进阶】java函数式编程的使用

    目录 1.目前Java中自带的函数式编程接口 2.java中使用函数式编程的案例 3.自定义函数式接口 4.自定义函数式接口的实现 简单一句话理解函数式编程,传统的方法调用我们都是传递参数,而函数式编 ...

  5. 【JAVA进阶】java中的集合(番外篇3)- HashMap源码底层数据结构分析

    写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...

  6. Java进阶:java字符串定位语句

    正文 模块(Module).组件(Component).包(Package),这些概念对于我们技术同学并不陌生,但并不是所有人都能理解其要义. 深入理解之后,我才发现,其背后的深意是分类思维.而这种分 ...

  7. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  8. 【Java进阶】Java并发类库提供的线程池有哪几种? 分别有什么特点?

    我在专栏第 17 讲中介绍过线程是不能够重复启动的,创建或销毁线程存在一定的开销,所以利用线程池技术来提高系统资源利用效率,并简化线程管理,已经是非常成熟的选择. 今天我要问你的问题是,Java 并发 ...

  9. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...

最新文章

  1. mysql两个表条件_mysql – 在另一个表中选择具有多个条件的...
  2. spoj 375 Query on a tree (树链剖分)
  3. 去除Activity的标题栏以及全屏显示
  4. 不要逼孩子考100分
  5. 把windows窗口编程浅绿色的方法
  6. 2000年不算在21世纪
  7. 1.24 Java周末总结 ①乘法数据的溢出 ②测试random随机数几率是否相等 ③判断字符串是否为纯数字...
  8. centos7.6内核升级
  9. redis 用scan 代替keys 解决百万数据模糊查询超时问题
  10. 囚徒困境、价格大战与 iPhone 的价格
  11. Silverlight DataGrid 在显示数据, 如果遇到全角的符号, 好像会出错. 待测试.
  12. 如何使用EasyRecovery的监控硬盘功能
  13. python2和python3的编码区别
  14. asp.net 利用jquery.form插件上传图片
  15. 物联网芯片的协议之Lora及其调制
  16. PT100温度采集电路设计
  17. 论文Time-Series Event Prediction with Evolutionary State Graph笔记
  18. 如何写一个好的缺陷(Defect)报告
  19. 开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门
  20. webpack打包vue项目之后生成的dist文件该怎样启动运行跑起来

热门文章

  1. 更便捷的画决策分支图的工具_做出更好决策的3个要素
  2. 预测股票价格 模型_建立有马模型来预测股票价格
  3. 剑指 Offer 53 - I. 在排序数组中查找数字 I(二分法)
  4. leetcode1343. 大小为 K 且平均值大于等于阈值的子数组数目(队列)
  5. leetcode面试题 08.04. 幂集(递归)
  6. Linux下创建动态库与使用
  7. jQuery与JS的区别,以及jQuery的基础语法
  8. Nginx 多进程连接请求/事件分发流程分析
  9. android 上下偏差怎么写_详解 Android 热更新升级如何突破底层结构差异?
  10. linux中win文件转为unix,如何将文本文件从Windows转换为Unix