jni 入门实例

来源:互联网 发布:布吕歇尔 知乎 编辑:程序博客网 时间:2024/06/06 04:28
----------------------------------------
author: hjjdebug
date: 2016年 09月 11日 星期日 21:53:22 CST
----------------------------------------
JNI: java native interface.
从java层调用c/c++的代码。
要用最简单语言,描述出事物的本质。
实现分为7步: 简化为3步
1. 写Java 代码    ; 重点关注对象1
2. 编译生成class  ;见Makefile
3. 使用javah 命令,生成C头文件    ;见Makefile
4. 编写头文件对应的c或cpp代码    ; 重点关注对象2
5. 编译生成动态链接库(.so)文件    ;见Makefile
6. 将so 文件拷入对应的目录中    ;见Makefile
7. 运行java类                    ;见Makefile
下面举例详述一下过程:
1. java 代码
 cat JniTest.javapublic class JniTest {static{System.loadLibrary("JniTest");}private native int add(int x, int y);private native String setString(String str);public static void main(String args[]){JniTest test=new JniTest();int res=test.add(100,200);System.out.println("<from java>Result is:"+res);String str="ha,ha,ha";String str2=test.setString(str);System.out.println("<from java>Result str is:"+str2);//System.out.println(System.getProperty("java.library.path"));}}

2. c 代码

 cat JniTest.c#include <stdio.h>#include "JniTest.h"JNIEXPORT jint JNICALL Java_JniTest_add (JNIEnv *env, jobject obj, jint a, jint b){int c = a + b;printf("<from so>res is:%d\n",c);return c;}JNIEXPORT jstring JNICALL Java_JniTest_setString (JNIEnv * env, jobject obj, jstring str){const char *s = (*env)->GetStringUTFChars(env, str, 0);printf("<from so>I get:%s\n", s);(*env)->ReleaseStringUTFChars(env, str, s);jstring js=(*env)->NewStringUTF(env,"<from so>hello,java,I done it!");return js;}

3. Makefile

cat Makefile #路径修改为你自己的路径INCPATH1=/usr/lib/jvm/java-7-oracle/includeINCPATH2=/usr/lib/jvm/java-7-oracle/include/linuxall:libJniTest.solibJniTest.so:JniTest.cgcc -I $(INCPATH1) -I $(INCPATH2) -shared -fPIC -o $@ $<#辅助目标class:javac JniTest.javaheader:javah JniTestcopy:sudo cp libJniTest.so /usr/librun:java JniTestclean:rm *.h *.class *.so

4. 运行结果:

~/myjava$ ls
JniTest.c  JniTest.java  Makefile
~/myjava$ make class
javac JniTest.java
~/myjava$ make header
javah JniTest
~/myjava$ make
gcc -I /usr/lib/jvm/java-7-oracle/include -I /usr/lib/jvm/java-7-oracle/include/linux -shared -fPIC -o libJniTest.so JniTest.c
~/myjava$ make copy
sudo cp libJniTest.so /usr/lib
[sudo] password for hjj:
~/myjava$ make run
java JniTest
<from so>res is:300
<from java>Result is:300
<from so>I get:ha,ha,ha
<from java>Result str is:<from so>hello,java,I done it!


0 0
原创粉丝点击