jni 基础入门
来源:互联网 发布:unity3d 流媒体播放 编辑:程序博客网 时间:2024/06/06 20:49
之前编写jni都是在Android中,这次突然想用原生态的Java调用c++。原来也是用jni的交叉编译的。
首先安装jdk,然后在jdk中会有jni的头文件 jdk->include文件中。
打开vs2005.新建一个DLL。
然后在属性中添加包含文件,选择jni.h所在路径。
然后编译的话,会出现问题,无法打开包括文件:“jni_md.h”: No such file or directory。
这是因为在系统目录下也没有jni_md.h这个头文件中,可以将JAVAHOME/include/win32下找到拷贝到项目目录下。
如果出现无法打开包括文件:“jni.h”: No such file or directory。那么就是还没有导入jni.h所在的路径。
接着就是编写代码
在DLL的头文件中。
#include <jni.h>
#include "jni_md.h" //在当前文件夹下
#ifndef _Included_MyDll
#define _Included_MyDll
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT int JNICALL Java_test1_get(JNIEnv*, jclass, jstring); // JNIEXPORT 返回类型 JNICALL JAVA_Java类所在文件夹_Java类型_方法(JNIENV *, jclass,参数...) 原型是这样的。
JNIEXPORT void JNICALL Java_test1_set(JNIEnv*, jclass, jint);
JNIEXPORT jstring JNICALL Java_test1_getString(JNIEnv*, jclass, jstring);
#ifdef __cplusplus
};
#endif
#endif
在DLL的cpp文件中
static int i;
JNIEXPORT int JNICALL Java_test1_get(JNIEnv* env, jclass obj, jstring s)
{
char * st = (char *) (env)->GetStringUTFChars(s, 0);
printf("%s--%d", st, i);
return i;
}
JNIEXPORT void JNICALL Java_test1_set(JNIEnv* env, jclass obj, jint j)
{
i = j;
}
JNIEXPORT jstring JNICALL Java_test1_getString(JNIEnv*env, jclass obj, jstring s)
{
char * st = (char *) (env)->GetStringUTFChars(s, 0);
char * str=st;
jstring rtn;
rtn = (env)->NewStringUTF(str);
return rtn;
}
接着就是在eclipse中的Java代码
在eclipse中直接新建一个Java project。然后新建一个class。
然后在设置导入的库
ps:出现 no XXX in Java.library.path的问题,则导入库后就可以解决(http://blog.openlg.net/index.php/archives/723)
在属性中选择Java Build Path->Libraries->Native library localtion,选择Edit。然后添加DLL所在的路径。
然后在剩下的就是Java代码了
public class test1 {
static{
System.loadLibrary("testDLL"); //导入库名
}
public native static int get(String s); //定义本地方法:public native static 返回类型 方法名(参数)
public native static String getString(String s);
public native static void set(int i);
public static void main(String[] args) {
test1 t = new test1();
t.set(7);
System.out.println(t.get("test id"));
System.out.println(t.getString("aaaaaa"));
}
}
最后的结果如下:
ps:其中类型之间的转换
http://dolphin-ygj.iteye.com/blog/519492
- JNI 入门基础
- jni 基础入门
- android jni入门基础
- 零基础 JNI 入门 + 进阶
- Android Studio JNI 基础入门--Hello World
- JNI开发基础入门系列(一)
- Jni开发基础入门(二)
- Jni基础开发入门(三)
- Jni基础开发入门(四)
- Jni基础开发入门(五)
- Jni基础开发入门(六)
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- JNI 入门
- JNI入门
- JNI入门
- javaee学习之路(十八)JDBC
- Snort源码分析
- 广东国医13行模板
- jsp和js区别 一
- Android--EditText/TextView 中添加图片,以及点击图片.
- jni 基础入门
- Minimum Depth of Binary Tree
- ConurrentHashMap和Hashtable的区别
- ios自动化打包
- In与Exists的区别
- golang截取字符串
- ERROR: Error: Please install Android target "android-19".
- [经典]Linux内核中ioremap映射的透彻理解
- jsp和js区别 二