您的位置:首页 > 编程语言 > Java开发

jni 入门实例

2016-09-11 22:10 106 查看
----------------------------------------

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.java
public 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/include
INCPATH2=/usr/lib/jvm/java-7-oracle/include/linux

all:libJniTest.so
libJniTest.so:JniTest.c
gcc -I $(INCPATH1) -I $(INCPATH2) -shared -fPIC -o $@ $<
#辅助目标
class:
javac JniTest.java
header:
javah JniTest
copy:
sudo cp libJniTest.so /usr/lib
run:
java JniTest
clean:
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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java native jni