-
Notifications
You must be signed in to change notification settings - Fork 1
jni入门
hustg4 edited this page Aug 13, 2014
·
8 revisions
-
从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分, 它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言, 尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
可见,jni并不是Android的功能,只是Android使用java作为开发语言,使得jni可以在Android下使用
本文旨在通过一个简单的示例,讲解jni的基础内容
- JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
- Eclipse 非必须,下载地址:http://www.eclipse.org/downloads/
- 注:本文示例在macosx下完成,windows上仅在生成动态链接库时不同,请读者自行修改完成
- 新建普通java项目,如下图所示:

- JNIClass
package com.test; public class JNIClass { public native int sum(int a, int b); }
- JNITest
package com.test; public class JNITest { static{ System.loadLibrary("JNIClass"); } public static void main(String[] args) { JNIClass jniClass = new JNIClass(); System.out.println("JNI-sum:" + jniClass.sum(10, 12)); } }
- 在终端里cd到项目的源文件目录,我的是:
/Users/xxx/Public/develop/workspace/eclipse/JNITest/src
- 编译JNIClass类,命令如下:
javac com/test/JNIClass.java
执行之后,在com/test目录下应该有JNIClass.class文件,此为java字节码文件
- 生成C头文件件,命令如下:
javah com.test.JNIClass
执行完上述命令,在src目录下应该有com_test_JNIClass.h文件,其中的<code>jint JNICALL Java_com_test_JNIClass_sum
(JNIEnv *, jobject, jint, jint)就是要实现的本地方法
此处要特别注意:
* <b>只能在src目录下执行此命令</b>
* <b>注意要输入完整类名,包括包名,用点号分隔,不是反斜杠,javah会自动找到正确的目录</b>
- 在src目录下创建文件
com_test_JNIClass.c
,内容如下:
#include "com_test_JNIClass.h" jint JNICALL Java_com_test_JNIClass_sum(JNIEnv *env, jobject obj, jint a, jint b) { return a + b; }
至此,项目目录结构如下图:
<img src="https://raw.githubusercontent.com/wiki/hustg4/CocosLua/jni/jni%E5%85%A5%E9%97%A8/2.png"/>
-
编写makefile
在src目录下创建文件
Makefile
,内容如下:
JDK = /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home run : cc -fPIC -D_REENTRANT -I$(JDK)/include -I$(JDK)/include/darwin -c com_test_JNIClass.c cc -shared -o ../libJNIClass.dylib com_test_JNIClass.o
其中JDK = .. 是jdk的目录,需要根据自己的环境配置
- make
在src目录下执行如下命令:
make
如果一切正常,会在项目根目录下生成动态链接库libJNIClass.dylib
,现在项目目录结构如下图所示:

JNI-sum:22eclipse工程下载地址:[JNITest](https://raw.githubusercontent.com/wiki/hustg4/CocosLua/jni/jni%E5%85%A5%E9%97%A8/JNITest.zip)
以上就是jni基础内容,更多文章,请继续关注。