基本流程

1. 创建一个类(HelloWorld.java)
2. 使用 javac 编译该类
3. 利用 javah -jni 产生头文件
4. 用本地代码实现头文件中定义的方法
5. Run

备注:在一个特定环境中,写本地实现的过程是不同的(如 Android)。

1.创建HelloWorld 

public class HelloWorld {
// 1.静态块,类加载时,加载一次
static {
System.loadLibrary("HelloWorld");
} // 2.使用native关键字声明native方法
private native void print(); public static void main(String[] args) {
new HelloWorld().print();
} }

2.编译,生成.class文件

javac -encoding utf-8 HelloWorld.java

PS.   -encoding utf-8  可选

3.生成.h文件

javah HelloWorld

注意事项:

1.没有后缀.class

2.如果有包名,要带上包名。比如  personal.hbl.HelloWorld

生成的HelloWorld.h文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */ #ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

本地方法:

JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
第一个参数是指向 JNIEnv 结构的指针。
第二个参数,为 HelloWorld 对象自身,即 this 指针。
JNIEnv 是 JNI 核心数据之一,地位非常崇高,所有对 JNI 的调用都要通过此结构。
编写实现:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj){
  printf("Hello World!\n");
  return;
}

请注意:"jni.h"文件必须被包含,该文件定义了 JNI 所有的函数声明和数据类型。

以下先备注着,暂时归结为: 生成.so库文件  --> 运行时,需要配置链接,以便运行。

4. Compile the C Source and Create a Native Library
请注意,生成的本地库的名字,必须与 System.loadLibrary("HelloWorld");待装载库的名字相同。
Solaris:

$cc -G -I/java/include -I/java/include/solaris HelloWorld.c -o libHelloWorld.so

-G: 生成共享库
Win:

$cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c

-FeHelloWorld.dll
-MD:保证与 Win32 多线程 C 库连接(译者:Win 上分静态、动态、动态多线程...C 库)
-LD: 生成动态链接库
5. Run the Program
Solaris or Win:

$java HelloWorld

输出:
Hello World!
运行前,必须保证连接器,能找到待装载的库,不然,将抛如下异常:

java.lang.UnsatisfiedLinkError: no HelloWorld in library path
at java.lang.Runtime.loadLibrary(Runtime.java)
at java.lang.System.loadLibrary(System.java)
at HelloWorld.main(HelloWorld.java)

如,Solaris, 通过 sh 或 ksh shell:

$LD_LIBRARY_PATH=.
$export LD_LIBRARY_PATH
C shell:
$setenv LD_LIBRARY_PATH .

在 Win 上,请保证待装载库在当前位置,或在 PATH 环境变量中。
你也可以如下:

java -Djava.library.path=. HelloWorld

-D:设置 Java 平台的系统属性。 此时 JavaVM 可以在当前位置找到该库。

JNI之Hello World!的更多相关文章

  1. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  2. 【走过巨坑】android studio对于jni调用及运行闪退无法加载库的问题解决方案

    相信很多小伙伴都在android开发中遇到调用jni的各种巨坑,因为我们不得不在很多地方用到第三方库so文件,然而第三方官方通常都只会给出ADT环境下的集成方式,而谷歌亲儿子android studi ...

  3. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  4. JNI 备注

    本文记录一个基础的JNI例子及过程中遇到的问题解决. 1.定义一个JAVA类如下: package jnidemo01; public class JniHello { public native v ...

  5. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  6. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  7. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  8. android JNI 调用NDK方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. jni操作jobject

    一. 注册JNI函数 1.         静态方法 一般使用javah进行编译,生成很长的文件名和函数名字,这个书写不方便,影响运行效率. 2.         动态注册 使用JNINativeMe ...

  10. JNI开发的常见错误

    1. 写错了load的library java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null 2. ...

随机推荐

  1. 【uva11732-"strcmp()" Anyone?】Trie

    http://acm.hust.edu.cn/vjudge/problem/28438 题意:给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. 题解: 插入一个‘#’作为字符串的结束 ...

  2. bzoj4839 [Neerc2016]Abbreviation

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4839 [题解] pkusc怎么出bzoj原题啊 字符串随便处理一下就行了,大模拟 pkusc ...

  3. bzoj1833: [ZJOI2010]count 数字计数 && codevs1359 数字计数

    bzoj1833 codevs1359 这道题也是道数位dp 因为0有前导0这一说卡了很久 最后发现用所有位数减1~9的位数就okay.....orzczl大爷 其他就跟51nod那道统计1出现次数一 ...

  4. c:forEach 如何输出序号

    关键在于<c:forEach>的varStatus属性,具体代码如下: <table width="500" border="0" cells ...

  5. Python3中的Bytes和str之间的关系

    文本总是unicode字符集,用str类型表示. 二进制数据则由bytes表示.(通过socket在网络上传输数据时必须要用二进制格式)   Python不会以任何隐式的方式混用str和bytes,所 ...

  6. js异步实现checkbox选中

    参考:https://blog.csdn.net/long19901216/article/details/51374064 https://blog.csdn.net/hahei2020/artic ...

  7. [Leetcode Week5]Word Ladder

    Word Ladder题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/word-ladder/description/ Description Give ...

  8. 2.kafka单节点broker的安装与启动

    下载kafka,http://kafka.apache.org/downloads kafka下面的文件结构如下: 进入bin目录,启动kafka之前要先启动zookeeper ./zookeeper ...

  9. WCF测试小程序

    using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;u ...

  10. snakes

    原地址 讨论区 Changing 算法一 我会随机! 由于我忘了设置多组数据,期望得分0至100. 算法二 我会模拟! 复杂度\(O(t^2)\),期望得分60. 但是很多人忘记题目给出的是环形-- ...