JNI

jni开发

此生再无相见时 提交于 2020-03-17 13:59:24
某厂面试归来,发现自己落伍了!>>> 安卓/手游逆向交流群963612891 jni开发 步骤: 1. 定义字符或者是方法,被native修饰; 2.Java -jni命令,生成被native修饰的.h文件; 3.h里面的东西赋值到.c,补充完整:添加参数、添加方法体; 配置两个mk文件 4.执行ndk命令生成so文件 5.回到Java层,加载so 6.加载保存,运行 jni静态注册 以调用C层字符串 1. 定义字符或者是方法,被native修饰; 2. Java -jni命令,生成被native修饰的.h文件; 注:要在文件src目录下 输入命令 >javah -jni 被定义的native 所在类的路径 3. h里面的东西赋值到.c,补充完整:添加参数、添加方法体; 函数名 .h文件生成 这里要结合jni.h文档看 找到方法 4. 配置两个mk文件 加入两个文件(Android.mk Application.mk),跟.c .h文件放一块 5. 执行ndk命令生成so文件 6. 回到Java层,加载so 7. 加载保存,运行 Jni接口 1.看有没有返回值,有要定义变量接收 无就不用管 2.*env-> 指出来 删掉后面括号 3. 把参数补充完整 动态注册 流程跟静态差不多 要注意绑定Java和C进行绑定 typedef struct { const char* name; /

C++调用java

落花浮王杯 提交于 2020-03-15 23:47:58
摘要: 1 java类生成c头文件和库文件 2 对于c/c++程序,启动时先启动jvm,然后获得对应的java类的对象和方法。然后正常使用。 最近正在做一个C/C++调用java的程序,这里说的调用java不是使用方式 exec(/path/to/java,.....),而是调用一个class文件中的一个特定的函数。 实践后总结如下: 1. 安装 jdk 2. 安装gcc(linux自带有的就无需安装了) 利用JNI(java native interface),来实现动态建立java runtime environment. 第一,C/C++程序中包含头文件"jni.h" #include <jni.h> 一般在JAVA_HOME/include 目录下。 调用jni.h中的方法建立runtime env 然后调用java 程序。 第二,编译 g++ -o testjava testjava.cpp -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -L${JRE_HOME}/lib/i386/client -ljvm 以上就是大致思路,现详细说明过程如下: #####################################################################################

Android—Camera Framework C/S架构服务请求

时光毁灭记忆、已成空白 提交于 2020-03-15 11:20:03
在前一篇文章 Camera Client/Server的binder IPC机制 中阐述了Android进程间通信binder IPC机制基础,Android Camera基于这个基础设计了Camera Framework Client/Server架构,文中给出了其类图设计。本文从Android 4.4 版本源码入手,分析Camera App向Camera Service请求服务与返回的过程。服务请求的过程从上到下依次要经过三个大的过程:1. Camera App调用Framework Camera类Java API;2. Camera类Java API通过JNI调用JNI层的C++接口函数;3. 基于binder通信设计的Camera IPC通信过程。下面结合代码分析整个服务请求过程。 Camera应用调用Framework Camera类API 在Android Kitkat原生Camera2应用(packages/apps/Camera2/)的PhotoModule, VideoModule, WideAnglePanoramaModule类中用CameraUtil.open()方法来打开Camera。然后依次调用:CameraHolder的open()方法,AndroidCameraManagerImpl的cameraOpen()方法

Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

若如初见. 提交于 2020-03-10 16:37:02
上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: [cpp] view plain copy JNIEXPORT void JNICALL Java_com_jni_demo_JNIDemo_sayHello (JNIEnv * env, jobject obj) { cout<< "Hello World" <<endl; } 对于这个方法参数中的JNIEnv* env参数的解释: JNIEnv类型实际上代表了Java环境,通过这个JNIEnv* 指针,就可以对Java端的代码进行操作。例如,创建Jaa类中俄对象,调用Java对象的方法,获取Java对象中的属性等等。JNIEnv的指针会被 JNI传入到本地方法的实现函数中来对Java端的代码进行操作。 JNIEnv类中有很多函数可以用: NewObject:创建Java类中的对象 NewString:创建Java类中的String对象 New<Type>Array:创建类型为Type的数组对象 Get<Type>Field:获取类型为Type的字段 Set<Type>Field:设置类型为Type的字段的值 GetStatic<Type>Field:获取类型为Type的static的字段

Python一键转Jar包,Java调用Python新姿势!

末鹿安然 提交于 2020-03-10 09:49:45
粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文。言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Python 给Python加速 寻找方向 Jython? Python->Native代码 整体思路 实际动手 关键问题 import的问题 Python GIL问题 测试效果 总结 需求背景 进击的Python 随着人工智能的兴起,Python这门曾经小众的编程语言可谓是焕发了第二春。 以tensorflow、pytorch等为主的机器学习/深度学习的开发框架大行其道,助推了python这门曾经以爬虫见长(python粉别生气)的编程语言在TIOBE编程语言排行榜上一路披荆斩棘,坐上前三甲的宝座,仅次于Java和C,将C++、JavaScript、PHP、C#等一众劲敌斩落马下。 当然,轩辕君向来是不提倡编程语言之间的竞争对比,每一门语言都有自己的优势和劣势,有自己应用的领域。 另一方面,TIOBE统计的数据也不能代表国内的实际情况,上面的例子只是侧面反映了Python这门语言如今的流行程度。 Java 还是 Python 说回咱们的需求上来,如今在不少的企业中,同时存在Python研发团队和Java研发团队,Python团队负责人工智能算法开发,而Java团队负责算法工程化

Qt_JNI_DLL_配置手册

独自空忆成欢 提交于 2020-03-09 13:56:40
上篇文章实现了Qt+MinGW+Opencv+Zbar的配置。接下来,由于项目需求,需要用Java调用,因此需要将之前二维码识别的代码编译成Dll,供java调用。 1 Java调用Dll的方法 1.1 利用Java自带的JNI JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。它允许Java代码和其他语言写的(本地已编译的)代码进行交,这样做通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。 基本流程是首先在java环境下,建立一个java的接口,然后利用Java自带的工具javah,将这个接口转换成C或C++类型的接口,然后,在VC或中Qt的环境下借助编译器,实现这个接口的功能,并编译成Dll。 在Java环境下通过调用这个Dll,就可以访问本地代码或已编译的库的功能, 这个方法的效率是最高的,缺点是由于对应于某一平台的 JNI 本地代码调用通常不能移植到其他平台上。 这种方法适用于核心代码大部分已经在本地完成,将代码重新写成Java的工作量复杂或者根本无法完成的情况,我们需要在本地用C++或C把这些代码封装起来供Java 使用,这个封装的Dll可以由我们指定实现某种功能,也就是说可以在保证Java代码不更改的情况下,改变程序的功能。 1.2 利用Java自带的JNA JNA

Android Studio 编写 JNI

情到浓时终转凉″ 提交于 2020-03-07 22:46:15
之前一直都不知怎么编写JNI,今天刚好学习一下,感谢梦真的指教,以及提供的文档。 参考链接    http://blog.csdn.net/u011168565/article/details/51878176    http://www.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html 创建一个jni类(.java文件)   1. 创建Android studio 工程   2. 切换到project视图   3. 创建jni类如下所示 package com.example.tony.jnidemo; /** * Created by Tony on 2016/7/19. */ public class JNITest { public native String getJNIString(); // jni接口函数 static { System.loadLibrary("hello-jni"); //加载jni动态库,只写库名,库名称是在build.gradle中指定的。 } } 生成.class文件   点击导航栏build-> Make Module "app", 编译jni类(.java文件),生成.class文件   生成的.class文件在app/build/intermediates

JNI 对象的操作

扶醉桌前 提交于 2020-03-07 22:08:10
1.编写java程序, 1.1 java 代码(Student.java) /** * */ package jni; /** * @author likun * */ public class Student { String name; int age; public Student(){ } public int getAge() { return age; } public void setAge( int age) { this .age = age; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String toString(){ System.out.println( "Name:" +name+ " Age:" +age); return "Name:" +name+ " Age:" +age; } } java 代码(StuService.java) /** * */ package jni; import java.util.Iterator; import java.util.List; /** * @author likun * */ public class StuService {

JAVA本地调用(JNI- java调用c)

这一生的挚爱 提交于 2020-03-07 22:07:47
记录一下工作内容,对术语了解不多,暂且这样记着吧。 java调用c 一、写jni的步骤如下: 1.创建java类,定义接口函数,使用native修饰; 2.将java类编译成class; 3.将class编译成*.h头文件; 4.在c/c++中实现java定义的接口函数; 5.将该c/c++的实现导出动态链接库; 6.将动态链接库放到java的库路径; 7.使用。 二、应该注意的一些问题: 1.注意该 java 类所在的包,包会影响导出的头文件的名称,还会影响到头文件的生成;代码中不要出现中文; 2.使用javac将类编译成class文件,该文件会出现在java文件同一目录下; 3.使用javah将class文件编译成头文件,这一步需要注意,如果该类在某个包下,需要在src路径下进行编译,最后给出例子。 4.在c/c++中实现时注意java类型和c/c++类型间的转换,我遇到的是jstring转换成char*的问题。 对于如下函数 JNIEXPORT void JNICALL Java_com_bbwang_JniTest_printMsg (JNIEnv *env, jobject o, jstring str) { } 如果是c实现,调用GetStringUTFChars时应该如下调用   const char *cstr = (*env)->GetStringUTFChars

JNI-入门之一

眉间皱痕 提交于 2020-03-07 22:07:19
下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。 编写java代码 我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } 注 意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因 为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载 hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so) 编译java代码 javac HelloWorld.java 生成HelloWorld.class文件 创建.h文件