[JNI]开发之旅(5)访问c/c++函数

来源:互联网 发布:cdr软件的印刷排版 编辑:程序博客网 时间:2024/06/05 03:59

前面介绍了那么多,不在废话,直接实例开撸,不懂步骤的请看: [JNI]开发之旅(1)开发流程介绍

调用C++函数

1.调用c++函数printf,输出一个hello JNI

java层:
定义一个JNIUtils

class JNIUtils{    public native void printC();    static{        System.loadLibrary("native-lib");    }}

c++层:我这里使用android studio2.2直接生成函数,没有编写.h文件,为了方便阅读,请使用javah生成.h文件。

#include <jni.h>#include <string.h>#include <stdio.h>//调用c++printf函数extern "C"void Java_com_honjane_ndkdemo_JNIUtils_printC( JNIEnv* env, jobject jobj){    printf("JNI printf : hello JNI");}

在这个文件中实现了一个简单的Jni方法。该方法调用 c++中的printf()函数,输出
JNI printf : hello JNI
上面例子在是基于java项目才能看到输入,android项目看不到printf的输出。

2.下面通过调用c++字符串相关函数,回传到java层输出,来实现通过JNI调用c++函数实例介绍。
java层定义native方法

public native String stringFromJNI();

c++层:

jstring Java_com_honjane_ndkdemo_JNIUtils_stringFromJNI(        JNIEnv* env,        jobject jobjet) {    std::string hello = "Hello from C++";    return env->NewStringUTF(hello.c_str());}

先定义了一个字符串hello,然后调用c++函数c_str();最后转换成jni string返回给java层使用。

JNIUtils jniUtils = new JNIUtils();Log.i(TAG,jniUtils.stringFromJNI());结果:JNIUtils:Hello from C++

其中std::string表示std类下string类型,这种写法相当于java中类.变量/方法(Person.name),”::” 等同于 “. “,这样写可以免去定义命名空间using name space std ;而这个命名空间又相当于java中的import xxx.xxx.xxx,也就是导入包。


调用c++自定义函数

对上面例子进行改造,在c++层定义一个函数printHello

//自定义函数printHellojstring printHello(JNIEnv * env){    std::string hello = "Hello from C++";    return env->NewStringUTF(hello.c_str());}extern "C"jstring Java_com_honjane_ndkdemo_JNIUtils_stringFromJNI(        JNIEnv* env,        jobject /* this */) {    //std::string hello = "Hello from C++";    //调用自定义函数   jstring hello = printHello(env);   return hello;}

输出结果:

JNIUtils:Hello from C++

java层访问c/c++函数简单介绍到这里。源码整理好后上传
源码:https://github.com/honjane/JNIDemo

0 0
原创粉丝点击