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 代码
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!
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!
相关文章推荐
- JNI入门及实例
- Android JNI学习之第一个入门实例
- Android JNI学习之第一个入门实例(确实花了不少功夫,也遇到了很多阻碍,不过还好,最终解决,记录下)
- JNI for Android, Android Studio NDK 入门 实例 demo
- android下NDK开发环境搭建及TestJNI入门实例完整过程
- Android JNI入门实例(Windows+Cygwin+Eclipse)
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
- Android JNI入门实例
- JNI 入门实例代码 , Linux, C++
- JNI简单入门实例
- 【JNI】 Android JNI入门实例(Windows+Cygwin+Eclipse)
- Android--jni入门实例
- linux上简单的JNI入门实例
- Android JNI入门实例
- Android JNI学习之第一个入门实例
- 【Android學習專題】Android JNI入门实例(Windows+Cygwin+Eclipse)
- 【Android學習專題】Android JNI入门实例(Windows+Cygwin+Eclipse)
- java jni 入门4 - 访问实例域,静态域
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
- Eclipse快速上手Hibernate--1. 入门实例---选择自 javamxj 的Blog