Skip to content
hustg4 edited this page Aug 13, 2014 · 8 revisions

什么是jni?

  • 从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分, 它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言, 尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

    可见,jni并不是Android的功能,只是Android使用java作为开发语言,使得jni可以在Android下使用

本文旨在通过一个简单的示例,讲解jni的基础内容

环境

编写java类

  • 新建普通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));
	    }
    }

生成native头文件

  • 在终端里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>

实现native方法

  • 在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,现在项目目录结构如下图所示:

运行 --- 现在可以运行JNITest了,运行结果:
JNI-sum:22
eclipse工程下载地址:[JNITest](https://raw.githubusercontent.com/wiki/hustg4/CocosLua/jni/jni%E5%85%A5%E9%97%A8/JNITest.zip)

以上就是jni基础内容,更多文章,请继续关注。