JNI 备注
本文记录一个基础的JNI例子及过程中遇到的问题解决。
1、定义一个JAVA类如下:
package jnidemo01;
public class JniHello {
public native void displayHelloWorld();
static {
System.loadLibrary("HelloDll");
}
public static void main(String[] args) {
new JniHello().displayHelloWorld();
}
}
2、编译成.class文件后,采用javah jnidemo.JniHello生成一个.h头文件;
3、在vs里创建一个类型为dll的空win32项目,拷贝进刚才的.h文件,并实现其.cpp,如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnidemo01_JniHello */ #ifndef _Included_jnidemo01_JniHello
#define _Included_jnidemo01_JniHello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnidemo01_JniHello
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jnidemo01_JniHello_displayHelloWorld
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
#include <jni.h>
#include "JniHello.h"
#include <stdio.h> JNIEXPORT void JNICALL
Java_jnidemo01_JniHello_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
4、编译生成dll文件并放置在java工程下,执行java程序,控制台打印"Hello world!"
在此过程中主要遇到的问题如下:
1、找不到jni.h
在工程 -> 右键 -> c/c++ -> 包含附件目录中 增加:
jdk的include目录 和 include\win32目录,主要是包含入jni.h和jni_md.h等;
2、error LNK1123: 转换到 COFF 期间失败
项目”-->“属性” --> “清单工具”,然后选择"输入和输出’ --> ‘嵌入清单’,将后面的‘是’改成‘否’;
3、no ** in java.library.path
1、将dll放置在工程目录下
2、采用System.load + 绝对路径
4、Can't load IA 32-bit .dll on a AMD 64-bit platform
vs2010默认的配置属性是win32,通过解决方案 -> 右键 -> 配置属性 ,修改win32为x64
备注:如果是调用第三方DLL的话,相当于写一个JNI的DLL然后在这个DLL中调用第三方;
//*****************************************************************************
1、在Android Studio中采用Jni调用原生库类似,只是需要引入NDK,可以认为是一个Android平台下的交叉编译环境。
2、建JAVA类、生成.H文件、到实现.H中的接口,于纯JNI类似;
3、在Android Studio中不再需要Android.mk 都编译脚本,由Gradle支持,如下:
defaultConfig {
applicationId "com.base.fredric.ndk01"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName = "NdkTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
JNI 备注的更多相关文章
- 【Java的JNI快速学习教程】
1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...
- Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)
1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...
- Jni Tips
1.JavaVM and JNIEnv JNI有两种关键的数据结构,JavaVM和JNIEnv,两者均为指向VM方法JNI方法的列表的的指针(C++版本中它们是Class,Class的所有成员均为函数 ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- JNI设置C++与java的结合(2)
我们可以看到其中有四个函数声明, Java_完整类名_方法名, 完整类名包括了包名, 例如demo.Sample1是完整类名, 对应的这里就是demo_Sample1. 在注释中我们可以看到这样一个东 ...
- 利用android studio 生成 JNI需要的动态库so文件
JNI: Java Native Interface, 提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...
- JNI之String类型
JNI使用的是改良的UTF-8格式的Strings. 以下文档来自官方: Modified UTF-8 Strings The JNI uses modified UTF-8 strings to r ...
- JNI调用实例
1. 环境 Windows7-64Bit VS2010-32Bit JDK1.8-64Bit 2. 步骤 2.1 创建NativePrint类 public class NativePrint { p ...
- JNI之数据类型
1. JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ; JNIEnv 与 JavaVM : 注意区分这两个概念; -- JavaV ...
随机推荐
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- tomcat开发远程调试端口以及利用eclipse进行远程调试
一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...
- Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中.下面介绍一下Win.ini文件的读写方法和注册表的编程. 先介绍下Win.i ...
- iOS微信里打开app,Universal Links
这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...
- 【干货分享】流程DEMO-制度发文和干部任免
流程名: 制度发文和干部任免 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: ...
- 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”
注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...
- git命令行操作
从本地上传代码到仓库(假设已经建好仓库): 1.初始化: git init 2.将所有文件加入缓存区: git add * 3.提交当前工作空间的修改内容: git commit -m 'commit ...
- excel常用技巧
复制表格时,如果要加上行标和列标.页面布局->工作表选项:标题,勾上打印->复制下拉框->复制为图片加上打印样式 一行长拆成几行短或几行短变成一行长的文本拆分,可以通过:填充-> ...
- Xamarin技术文档------VS多平台开发
此技术业余时间研究,仅供大家学习参考,不涉及深入研究,有一定开发基础的人员,应该都能较快上手. 一.简介 Xamarin始创于2011年,旨在使移动开发变得难以置信地迅捷和简单.Xamarin的产品简 ...
- 【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w 作者:腾讯TMQ专项测 ...