您的位置:首页 > 编程语言 > C语言/C++

jni java调用c++实现的dll

2012-09-10 17:41 531 查看
忽如一夜春风来,千树万树梨花开。听说android支持了c++开发,哥们那叫个happy。只可惜,现在才开始学习。搜啊搜,说是要用ndk。搜啊搜,知道了ndk是用c++写.so(windows下为dll),java来调用。搜啊搜,ndk里面sample是用了jni。搜啊搜,就有了自己的这篇入门随笔。欢迎大家讨论,但是不要骂人,你骂人爽了,可是你的娘亲可就要受苦了。废话不多说了,开整。

java需要安装jdk。jdk安装配置好后,就开始java代码了。

java代码:

public class testjni

{

//本人java业余菜鸟一枚,这个单独写个static是搞什么还请各位看官指点一番,能否将System.loadLibrary("calcjni");放到main的第一行执行?暗爽...

static

{

//调用calcjni.dll/.so 中的功能

//System.loadLibrary("calcjni");

}

//native 函数,这里声明,在C++中实现。这就类似于给你一个.h文件,一个dll,你就可以适用dll中到处都函数了。各种爽。

public native static int Add(int x,int y);

//同上

public native static int Subtract(int x,int y);

public static void main( String[] args)

{

//调用calcjni.dll/.so 中的功能,参考的样例中是写在外面的,我这里试试我的想法。

System.loadLibrary("calcjni");

testjni test = new testjni();

int addRe = test.Add(10,3);

int subRe = test.Subtract(10,3);

System.out.println("Add(10,3)="+addRe);

System.out.println("Subtract(10,3)="+subRe);

}

}

先将上面的代码编译 javac testjni.java得到testjni.class

然后javah testjni ,得到testjni.h。这个头文件,就是你想用c++来实现的功能。

下面该c++闪亮登场了。大家给点掌声,掌声再响亮些。

c++代码:

#include "testjni.h"

/*

* Class: testjni

* Method: Add

* Signature: (II)I

*/

JNIEXPORT jint JNICALL Java_testjni_Add

(JNIEnv *, jclass, jint x, jint y)

{

return x+y;

}

/*

* Class: testjni

* Method: Subtract

* Signature: (II)I

*/

JNIEXPORT jint JNICALL Java_testjni_Subtract

(JNIEnv *, jclass, jint x, jint y)

{

return x-y;

}

当然,c++是要生成dll(windows系统),所以我用VS2010,win32,dll,emptyproject,然后导入testjni.h,编译生成calc.dll。

编译的时候会说jni.h,jni_md.h文件找不到。那就设置下包含路径吧。属性,c/c++常规,附加包含目录,将jni.h和jni_md.h文件所在的目录包含进来,jdk安装目录下的include和include/win32下。

然后把calc.dll拷贝到testjni.class目录下,执行java testjni 。得到结果。

这是我第一次折腾,算是为c++搞android做个技术储备吧。that's all,3Q.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: