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

最简单的Android JNI开发入门,JNI环境配置

2017年12月07日 ⁄ 综合 ⁄ 共 2171字 ⁄ 字号 评论关闭

 最简单的Android JNI开发入门,JNI环境配置

转载请注明出处,谢谢: http://blog.csdn.net/wj2030/article/details/38024249

本文主要讲述在adt-bundle-windows-x86_64-20131030构架Android JNI开发环境以及如何快速开发出一个Hello World程序。

1.确保adt版本在v22以上或更高,低于V22版本为测试。

2.确保已经下载android-ndk-r9d-windows-x86_64。同时版本为R9,或更高版本。低版本未测试。

############下面为配置及开发步骤##########

1.安装cdt8.0以上版本。我的软件之前安装,现在不需要安装。所以不做说明。同时,cdt只是为了在eclipse下方便开发C/C++代码。不是必须的。

2.新建一个Android工程AndroidJNI,然后一路next-->finish.

3.修改默认的layout文件。给TextView添加一个id:

<TextView
        android:id="@+id/tv_helloworld"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

4.将鼠标放在AndroidJNI工程上,右击鼠标->Android Tools->Add Native Support:使用默认库名。Finish.

5.此时软件会自动在工程目录下生成jni目录,

其中AndroidJNI.cpp为库文件的源文件。Android.mk为类似于Linux下的Makefile文件,用于指定库文件编译规则。打开AndroidJNI.cpp编辑添加如下源代码:

#include <jni.h>
//使用extern C
extern "C"{

 JNIEXPORT jstring JNICALL
 Java_com_example_myjni_MainActivity_StringFromC(JNIEnv* env, jobject obj)
 {
     return env->NewStringUTF("Hello form c");
 }

}

这里解释一下各部分代码意义:

a).头文件  <jni.h> 中定义了jni开发下要使用的各种数据结构和方法

b).extern "C" { } 是考虑到C编译器和C++编译器的不同,兼容C/C++代码互相调用的问题。具体可以百度。

c).JNIEXPORT  JNICALL 是JNI关键字,表明该函数是用于JNI调用的。

d).jstring 为该函数返回值类型。具体参考jni.h

e).Java_com_example_androidjni_MainActivity_StringFromC 为Java_+包名+类名+函数名。其中均以'_'连接。

f).(JNIEnv* env, jobject obj)为函数传入参数

g).return env->NewStringUTF("HelloWorld Form C Code");为函数操作和返回值

6.编写Java代码调用C库。在MainActivity.java中。如下编写:

package com.example.androidjni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

    //静态代码块加载本地库文件
    static{
        System.loadLibrary("MyJNI");
    }
    
    //声明本地库函数
    public native String StringFromC();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv_hello = (TextView) this.findViewById(R.id.tv_helloworld);
        tv_hello.setText(StringFromC());
        
    }

    @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;
    }
    
}

编译运行,可以在手机上看到如下结果,说明编译成功。

抱歉!评论已关闭.