jdk环境变量配置:

path中增加下面2个路径,也就是android studio的路径,android有自带的jdk。

E:\Android\Android Studio\jre\bin
E:\Android\Android Studio\bin
新建工程:

一定要选择Native c++类型,最后要选c++11支持。

SDK设置:

File->Settings

File->Project Structure

首先确定工程的目录结构,然后尝试运行一下工程,使用模拟器,确保工程没问题,

在MainActivity的同级目录,新建一个

jni_interface.java,然后做一个简单的实现,

 

 

jstring str2jstring(JNIEnv* env,const char* pat){    //定义java String类 strClass    jclass strClass = (env)->FindClass("java/lang/String");    //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String    jmethodID ctorID = (env)->GetMethodID(strClass, "", "([BLjava/lang/String;)V");    //建立byte数组    jbyteArray bytes = (env)->NewByteArray(strlen(pat));    //将char* 转换为byte数组    (env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);    // 设置String, 保存语言类型,用于byte数组转换至String时的参数    jstring encoding = (env)->NewStringUTF("GB2312");    //将byte数组转换为java String,并输出    return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);}std::string jstring2str(JNIEnv* env, jstring jstr){    char*   rtn   =   NULL;    jclass   clsstring   =   env->FindClass("java/lang/String");    jstring   strencode   =   env->NewStringUTF("GB2312");    jmethodID   mid   =   env->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");    jbyteArray   barr=   (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);    jsize   alen   =   env->GetArrayLength(barr);    jbyte*   ba   =   env->GetByteArrayElements(barr,JNI_FALSE);    if(alen   >   0)    {        rtn   =   (char*)malloc(alen+1);        memcpy(rtn,ba,alen);        rtn[alen]=0;    }    env->ReleaseByteArrayElements(barr,ba,0);    std::string stemp(rtn);    free(rtn);    return   stemp;}extern "C" JNIEXPORT jstring JNICALLJava_com_example_jni_1test_MainActivity_stringFromJNI(        JNIEnv* env,        jobject /* this */) {    std::string hello = "Hello from C++";    return env->NewStringUTF(hello.c_str());}extern "C"JNIEXPORT jstring JNICALLJava_com_example_jni_1test_jni_1interface_jni_1call(JNIEnv *env, jobject thiz, jstring str1,                                                    jstring str2, jstring str3) {    // TODO: implement jni_call()}

修改MainActivity.java中的onCreate函数,

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        //tv.setText(stringFromJNI());
        tv.setText("hello 9+10= " + new hello().add(9, 10));
    }
然后,rebuild project,没有错误后,然后run app。

最终程序整体目录结构,以及运行效果,

 

JNI的整体流程思路:

Java先定义一个类,类中定义一个需要c++来实现的方法.
通过javah生成需要c++实现的.h的c++头文件
实现.h的c++头文件中定义的方法
Cmake编译运行
 
 

更多相关文章

  1. Android:搭建NDK环境(Cygwin+android-NDK)
  2. 自定义图片点击效果
  3. 自定义tabhost实现
  4. Android:CourseTableLayout — 好用的Android自动生成课程表的自
  5. 自定义 RadioButton 选中和未选中时的图片
  6. animation的xml定义中的android:interpolator属性
  7. Android简单自定义圆形和水平ProgressBar
  8. android 自定义 permission 权限
  9. android 自定义对话框

随机推荐

  1. android Paint 设置线宽setStrokeWidth()
  2. android获取mac地址方法
  3. 更改ProgressBar颜色,SwipeBack滑动返回
  4. Android(安卓)之通知Notification应用
  5. android文件解析InputStream问题解决
  6. android studio 启动报nexpected excepti
  7. 开始使用Google Maps Android(安卓)API v
  8. Android电池电量更新 - BatteryService(转
  9. Android完全退出应用程序的方法
  10. 一个Android实现图片的倒影效果的代码示