JNI

图文教程vs2008+eclipse开始jni教程实例(一)

China☆狼群 提交于 2019-12-21 13:42:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 原创文章,欢迎转载,转载请说明 1、在eclipse中新建一个testJni的工程,新建一个package com.easou.abo.jnitest 2、在com.easou.abo.jnitest下新建一个类Demo,代码如下 package com.easou.abo.jnitest; public class Demo { public native void sayHello(); public static void main(String[] args) { System.loadLibrary("testJni"); Demo dm = new Demo(); dm.sayHello(); } } 3、运行cmd,定位到E:\workspace\testJni\bin(也就是testJni工程下bin目录) 运行命令 javah com.eaosu.abo.jnitest.Demo 执行完后,在bin目录下会有多一个com_easou_abo_jnitest_Demo.h的文件,这个在后面C语言中会用到 4、打开vs2008新建一个名为testJni的win32控制台项目 点击确定->下一步,选中dll,附加选项中选择空项目 点击完成,如图 5、将我们刚javah出来的h文件复制到C:

JNI入门

我与影子孤独终老i 提交于 2019-12-20 10:21:15
学习了一下JNI,发表文章的时候不知道该选什么好了,不知道JNI应该属于那个范畴^_^。       1.简介      JNI是Java Native Interface的缩写,它的设计目的是:      The standard Java class library may not support the platform-dependent features needed by your application.      You may already have a library or application written in another programming language and you wish to make it accessible to Java applications      You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions       2.JNI的书写步骤      编写带有native声明的方法的java类     

JNI笔记-字符串拼接

大憨熊 提交于 2019-12-13 09:31:18
参考博客:https://blog.csdn.net/cloverjf/article/details/78851988 记录一下在JNI中,由java传递到JNI,然后拼接返回新字符串的实现方式: 1、简单粗暴型 extern "C" JNIEXPORT jstring JNICALL Java_com_wyl_ndkdemo_JniTest_contactString2 ( JNIEnv * env , jobject thiz , jstring str1 , jstring str2 ) { //1、直接使用GetStringUTFChars方法将传递过来的jstring转为char* char * c1 = ( char * ) ( env -> GetStringUTFChars ( str1 , JNI_FALSE ) ) ; char * c2 = ( char * ) ( env -> GetStringUTFChars ( str2 , JNI_FALSE ) ) ; //2、再使用本地函数strcat 拼接两个char*对象,然后NewStringUTF转为jstring返回去 char * res = strcat ( c1 , c2 ) ; return env -> NewStringUTF ( res ) ; } 2、活学活用型 在学习JNI的过程中

JNI快速学习

此生再无相见时 提交于 2019-12-12 23:17:51
JNI是JVM中的一部分,它的存在就是为了打通java和native模块的桥梁。刚接触的时候会遇到一堆陌生的api,其实这些api的命名比较规范,调用几次之后就能举一反三。关键是要弄懂JNI的一些调用顺序,以下就是我用JNI碰到的一些关键点所做的记录。 JNI_OnLoad JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { // TODO: 保存vm在本地 } JNI_OnLoad是JNI调用native的第一个函数,算是JNI的入口。参数vm一般是需要保存下来,因为它是访问JVM的一个关键对象。 JNIEnv env对象是每次Java和Navtive调用的必须参数,这个参数可以每次用的时候由JavaVM对象获取得到 static bool getEnv(JNIEnv **env) { bool bRet = false; do { if (JAVAVM->GetEnv((void**)env, JNI_VERSION_1_4) != JNI_OK) { LOGD("Failed to get the environment using GetEnv()"); break; } if (JAVAVM->AttachCurrentThread(env, 0) < 0) { LOGD("Failed to

Win64下通过JNI(C++)创建jvm

假装没事ソ 提交于 2019-12-10 17:26:56
在Win64下通过jni启动jvm并运行java类: 环境设置: jdk: jdk7_45(x64) vs2010 64位命令行工具, 用来编译我们写的C++,就是这个: 环境变量设置: LIB变量添加 “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64”, 编译时能找到64位库; LIB变量中添加%JAVA_HOME%\lib,主要是在编译时能找到jvm.lib库文件; PATH变量中添加%JAVA_HOME%\jre\bin\server,主要是为了运行编译后的exe文件能找到jvm.dll文件. 码代码: java代码(待执行): public class HelloInvocation{ public static int add(int a, int b) { return a+b; } } c++代码: #include <jni.h> #include <stdlib.h> #include <string.h> #ifdef _WIN32 #define PATH_SEPARATOR ';' #else #define PATH_SEPARATOR ':' #endif int main(){ JavaVMOption options[1]; JNIEnv *env; JavaVM *jvm;

JNI_OnLoad函数不存在的问题

…衆ロ難τιáo~ 提交于 2019-12-10 14:27:33
今天分析一个app的老版本时,无意发现JNI_OnLoad不存在,但是so的确是java层load加载,各native函数也有声明和调用,以为又遇到什么黑科技。查找发现最早期的ndk开发版本中的确是没有这个函数的。 现期各版本的ndk中JNI_OnLoad函数都是load时自动调用的,如果未发现则去调用dvmResolveNativeMethod。以下时一份详细的流程解释。 以下摘自 http://yanbober.github.io/2015/02/25/android_studio_jni_3/ Android OS加载JNI Lib的方法有两种: 通过JNI_OnLoad。 如果JNI Lib实现中没有定义JNI_OnLoad,则dvm调用dvmResolveNativeMethod进行动态解析。 PS:咱们上面第一部分就是dvm调用dvmResolveNativeMethod进行动态解析,所以log打印No JNI_OnLoad found。 从网上查到的深入解析(此解析模块代码引用自网络) JNI_OnLoad机制分析 System.loadLibrary调用流程如下所示: System.loadLibrary->Runtime.loadLibrary->(Java)nativeLoad->(C: java_lang_Runtime.cpp)Dalvik_java

jni详解(摘自《jni详解》)

北战南征 提交于 2019-12-10 14:08:18
本书涵盖了 Java Native Interface(JNI)的内容,将探讨以下问题: • 在一个 Java 项目中集成一个 C/C++库 • 在一个用 C/C++开发的项目中,嵌入 JavaVM • 实现 Java VM • 语言互操作性问题,特别是互操作过程中的垃圾回收(GC, garbage collection)和并 发编程(multithreading) 译注: JNI(Java Native Interface)是 SUN 定义的一套标准接口,如 Dalvik, Apache Harmony 项目...等 Java 虚拟机,都会实现 JNI 接口,供本地(C/C++)应用与 Java VM 互调。 JNI: 可以供 Java 代码调用本地代码,本地代码也可以调用 Java 代码,即上文列出的第 4 条内容:语言互操作;所以,这是一套完善而功能强大的接口。 可能有朋友听说过 KNI,那是 J2ME VM(CLDC)中定义的一套东西,不如 JNI 强大。 此外,因为 C/C++在系统编程领域的地位,只要打通了与 C/C++的接口,就等于是天堑变 通途。 首先,通过本书,你会很容易的掌握 JNI 开发,并能了解到方方面面的关于 JNI 的知识。 本书详尽的叙述,会带给你你很多如何高效使用 JNI 的启示。JNI 自 1997 年初发布以来, Sun 的工程师们和 Java

jni c++ dll java

我怕爱的太早我们不能终老 提交于 2019-12-10 13:57:21
java通过jni 来调用.dll(在linux中称为.so文件) c++->.dll (windows) c++->.so (linux) 所以加载时,只要指定名就行了. 开发步骤; / * * 1.建立java工程编写带有native声明的方法的java类 * 2.用javac命令编译所的java类 * 3.使用javah java类名生成扩展名为h的头文件 * 4.使用c/c++实现 本地方法,并生成动态连接库 5.把库文件拷贝到java工程上当下,运行java程序 */ public class ArrayTest { static { System.loadLibrary("liujian"); } //定义一个方法; private native int sumArray(int[] arr); public static void main(String[] args) { ArrayTest test=new ArrayTest() ; int arr[] =new int[10]; for(int i=0;i<10;i++) { arr[i]=i; } test.sumArray(arr); } } >>>javac ArrayTest.java >>>javah ArrayTest 生成了个ArrayTest.h文件 vc++创建个windows 32

Java中JNI的使用详解第一篇:HelloWorld

与世无争的帅哥 提交于 2019-12-10 13:56:57
今天开始研究JNI技术,首先还是老套路,输出一个HelloWorld:具体流程如下:在Java中定义一个方法,在C++中实现这个方法,在方法内部输出“Hello World",然后再回到Java中进行调用。分为以下步骤: 第一步:在Eclipse中建立一个类:JNIDemo [java] view plain copy package com.jni.demo; public class JNIDemo { //定义一个本地方法 public native void sayHello(); public static void main(String[] args){ //调用动态链接库 System.loadLibrary( "JNIDemo" ); JNIDemo jniDemo = new JNIDemo(); jniDemo.sayHello(); } } 其中sayHello就是要在C++中实现的方法。 第二步:使用javah命令将JNIDemo生成.h的头文件: 命令如下: E:\workspace\JNIDemo\bin>javah com.jni.demo.JNIDemo 注意: 1. 首先要确保配置了Java的环境变量的配置,不然javah命令不能用,具体怎么配置见: http://blog.csdn.net/jiangwei0910410003/article

javah生成C++头文件(.h)

梦想与她 提交于 2019-12-10 13:42:34
在eclipse中建一项目,建一class,即TestHello.java文件 1 package esmart.colfile.parse 3 public class TestHello { 4 static { 5 System.loadLibrary( " TestHello " ); 6 } 8 public static native void hello(String msg); 10 public static void main(String[] args) { 12 hello( " Hello,Kimm! " ); 14 } 15 } 往往报如下的错误,就是因为shell命令的格式不对,应该严格按照我下面描述的格式来写,尤其注意第二步第三句的点和空格,就不会出错了。 错误: 无法访问 esmart.colfile.parse.TestHello 找不到文件 esmart.colfile.parse.TestHello.class javadoc: 错误 - 找不到类 esmart.colfile.parse.TestHello。 Error: 未在命令行中指定任何类。请尝试使用 -help 打开cmd命令框,输入shell命令,按照如下顺序输入 : 第一步 :进入TestHello.java文件的上级目录,编译该文件,则能在G:\work\eclipse