NDK的一个简单例子代码

来源:互联网 发布:2017程序员考试真题 编辑:程序博客网 时间:2024/04/28 23:22

MainActivity.java代码:

/* *  * 这是NDK中java与C++数据传输的接口例子 * */package com.example.test1;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.Toast;public class MainActivity extends Activity {static {        System.loadLibrary("Test1");       }native public static int getInt() ;native public static String stringFromJNI();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toast.makeText(MainActivity.this, ""+getInt()+stringFromJNI(), Toast.LENGTH_SHORT).show();    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    }

Test1.cpp代码:

#include <jni.h>extern "C"JNIEXPORT jint JNICALLJava_com_example_test1_MainActivity_getInt(){return 8;}extern "C"//每一个C++的函数都要加上这个,C语言文件不用加JNIEXPORT jstring JNICALLJava_com_example_test1_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz) {    return env->NewStringUTF("Hello jni");}/* 补充说明: * 一、本地函数的返回值为jstring.这种类型是在jni.h中定义的,表示本地代码层中的Java.lang.String对名。 * 二、函数的名字必须以Java包和类名开关,它标识了声明相关本地方法 的位置。 * 三、函数的第一个参数env的类型为JNInv指针。JNIEnv是jni.h是定义的一个C结构体,标识该JNI函数可以在Java中被调用 并与之交互。 * 四、函数的第二个参数thiz的类型为jobject.这个类型是在jni.h中定义的,它表示了本地代码层任意的一个Java对象。传递给该参数的值 * 是一个隐式的thiz实例,是Java VM传递给所有Java实例方法的值。 * 五、这个函数会将env参数解引用来调用 NewStringUtf()JNI函数。NewStringUTF()将它的第二个参数(一个C字符串)转换成相应的jstring * (这个字符串是用Unicode UTF编码标准编码的),并将这个Java字符串返回,最后返回给Java层。 * 六、在C语言中使用JNI时,想要调用JNI函数就得解开JNIEnv参数(例如*env)。同样,必须把JNIVnv作为第一个参数传递给JNI函数。 * 相反,C++中则不需要这么麻烦:没必要非得解引用JNInv参数也不需要把它作为第一个参数递给JNI函数。例如,各序清单中用C编写的函数调用时 * 用(*env)->NewString(env,"Hello jni"),而在C++中则可以写成env->NewString("Hello jni"); * * *//*JNIEXPORT jstring JNICALLJava_com_example_firstndk_MainActivity_other(JNIEnv *env,jobject thiz){}*/

android.mk代码:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := Test1LOCAL_SRC_FILES := Test1.cppinclude $(BUILD_SHARED_LIBRARY)


0 0