现在的位置: 首页 > 综合 > 正文

jni java调用c++实现的dll

2018年09月17日 ⁄ 综合 ⁄ 共 1554字 ⁄ 字号 评论关闭

忽如一夜春风来,千树万树梨花开。听说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.

抱歉!评论已关闭.