java_jni详解_01

30 篇文章 0 订阅
17 篇文章 0 订阅
java中的jni 例子HelloWorld

准备过程:
1. 创建一个类(HelloWorld.java)
2. 使用javac编译该类 HelloWorld.class
3. 利用javah -jni产生头文件 HelloWorld.h
4. 用本地代码实现头文件中定义的方法 HelloWorld.c
5. 编译c文件 HelloWorld.so 或者 HelloWorld.dll
6. 运行

HelloWorld.java
public class HelloWorld {
public native void print(); //声明本地方法

public static void main(String[] args) {
new HelloWorld().print();
}

static{
System.loadLibrary("HelloWorld"); // 加载库文件
}
}


javac 编译HelloWorld文件
javac HelloWorld.java


创建头文件 进入到工程的bin目录下
javah -jni HelloWorld
javah jni.sample.HelloWorld
"-jni"为默认参数,可有可无.
关键代码如下:
/*
* Class: jni_sample_HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_sample_HelloWorld_print
(JNIEnv *, jobject);

[color=red]JNIEnv 是 JNI 核心数据之一,地位非常崇高,所有对 JNI 的调用都要通过此结构。[/color]


实现头文件:
HelloWorld.c文件
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
// printf 在stdio.h头文件中
JNIEXPORT void JNICALL Java_jni_sample_HelloWorld_print(JNIEnv* env,jobject thiz)
{
printf("Hello World!\n");
return;
}

在工程的bin目录下
gcc -dynamiclib -o libhelloworld.so HelloWorld.c -framework JavaVM -I/System/Library/Frameworks/JavaVM.framework/Headers
编译C++代码的时候在MacOS下和在Linux, Windows有所不同, 不是编译成.so或者dll, 而是MacOS自己的jnilib. 并且jni.h的目录也比较特殊, 是/System/Library/Frameworks/JavaVM.framework/Headers/, 这个需要稍微注意一下

windows下
cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c
-FeHelloWorld.dll


1) 在/Users下建立一个用来存放.so库文件的目录,比如/Users/zhaoshun/solibs
2) 把libhelloworld.so文件拷贝到该目录下
3)打开Terminal,运行如下命令
export LD_LIBRARY_PATH=/Users/zhaoshun/solibs
只在当前shell下有效...

也可以用绝对路径
System.load("/Users/zhaoshun/solibs/libhelloworld.so");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值