本文记录一个基础的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 备注的更多相关文章

  1. 【Java的JNI快速学习教程】

    1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...

  2. Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)

    1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...

  3. Jni Tips

    1.JavaVM and JNIEnv JNI有两种关键的数据结构,JavaVM和JNIEnv,两者均为指向VM方法JNI方法的列表的的指针(C++版本中它们是Class,Class的所有成员均为函数 ...

  4. OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)

    OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...

  5. JNI设置C++与java的结合(2)

    我们可以看到其中有四个函数声明, Java_完整类名_方法名, 完整类名包括了包名, 例如demo.Sample1是完整类名, 对应的这里就是demo_Sample1. 在注释中我们可以看到这样一个东 ...

  6. 利用android studio 生成 JNI需要的动态库so文件

    JNI:  Java Native Interface,  提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...

  7. JNI之String类型

    JNI使用的是改良的UTF-8格式的Strings. 以下文档来自官方: Modified UTF-8 Strings The JNI uses modified UTF-8 strings to r ...

  8. JNI调用实例

    1. 环境 Windows7-64Bit VS2010-32Bit JDK1.8-64Bit 2. 步骤 2.1 创建NativePrint类 public class NativePrint { p ...

  9. JNI之数据类型

    1. JNIEnv 作用 JNIEnv 概念 : 是一个线程相关的结构体, 该结构体代表了 Java 在本线程的运行环境 ; JNIEnv 与 JavaVM : 注意区分这两个概念; -- JavaV ...

随机推荐

  1. NodeJs之log4js

    log4js log4js是一个管理,记录日志的工具. 其实与morgan的作用类似. 安装 npm install -g log4js log4js的6个日志级别 分别是:trace(蓝色).deb ...

  2. ABP文档 - 嵌入的资源文件

    文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...

  3. HttpUrlConnection 基础使用

    From https://developer.android.com/reference/java/net/HttpURLConnection.html HttpUrlConnection: A UR ...

  4. Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

    前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...

  5. jQuery学习之路(6)- 简单的表格应用

    ▓▓▓▓▓▓ 大致介绍 在CSS技术之前,网页的布局基本都是依靠表格制作,当有了CSS之后,表格就被很多设计师所抛弃,但是表格也有他的用武之地,比如数据列表,下面以表格中常见的几个应用来加深对jQue ...

  6. 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)

    微软发布了SQLServer for Linux,但是安装竟然需要3.5GB内存,这让大部分云主机用户都没办法尝试这个新东西 这篇我将讲解如何破解这个内存限制 要看关键的可以直接跳到第6步,只需要替换 ...

  7. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  8. C#事件-使用事件需要的步骤

    事件是C#中另一高级概念,使用方法和委托相关.奥运会参加百米的田径运动员听到枪声,比赛立即进行.其中枪声是事件,而运动员比赛就是这个事件发生后的动作.不参加该项比赛的人对枪声没有反应. 从程序员的角度 ...

  9. [转]NopCommerce How to add a menu item into the administration area from a plugin

    本文转自:http://docs.nopcommerce.com/display/nc/How+to+code+my+own+shipping+rate+computation+method Go t ...

  10. 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...