首先建立一个空类,名叫
package com;
public class JniLocalLib {
}
然后加入一个需要jni去实现的函数,以native关键字修饰。
package com;
public class JniLocalLib {
public native int localPlus(inta,intb);
}
在class目录的根目录那里,使用控制台命令,javah 生成jni类的C++头文件。如下图:
生成的文件 com_JniLocalLib.h 内容如下:
/* DO NOT EDIT THIS FILE - it ismachine generated */
#include <jni.h>
/* Header for class com_JniLocalLib*/
#ifndef _Included_com_JniLocalLib
#define _Included_com_JniLocalLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_JniLocalLib
* Method: localPlus
* Signature: (II)I
*/
JNIEXPORT jint JNICALLJava_com_JniLocalLib_localPlus(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
接下来就需要在你自己比较喜欢用的C++开发工具里面去实现这个C++函数就可以了,你可以用VS,可以用DEV C++,只要支持C++就行,如果你要在android里面用,那就应该用android nativesdk。
比如我在VS里面来做
第一步随便建个工程,但是类型要求是DLL类型工程。
然后将生成的那个头文件,加入到工程里,再添加一个同名cpp文件
在cpp文件里,添加两个include选项
一个是刚才的jni头文件,一个是vs需要的stdafx.h头文件
看到有错误提示,那是因为jdk/inclue 路径没有加入到vs的头文件查找路径列表里。
\
代码很简单,可以编译过了,编译一个release版的 dll文件出来,复制到本地平台的PATH环境变量的目录里,比如C:/Windows里,或者jre的目录里,实际开发的时候,要专门在项目的文件夹下专门放一个目录,并且注册到系统环境变量。本例子就放在C:/windows目录下就可以了
修改java类的代码如下。
package com;
public class JniLocalLib {
static {
System.loadLibrary("JniTestLib");//不要dll。
}
public native int localPlus(inta,intb);
}
写一个测试代码
package com;
public class Main {
/**
* @paramargs
*/
public static void main(String[]args) {
JniLocalLiblocalLib =newJniLocalLib();
System.out.println(localLib.localPlus(100, 10));
}
}
运行效果如下图:
下一章会更新比较详细的在C++里面操作java对象的例子,以及如何在android里面应用jni。