JNI入门完整详细示例

mainActivity如下:

package c.c;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;
/**
 * JNI的HelloWorld示例
 * 1 下载和安装cygwin.重要参考资料:
 *   http://www.cnblogs.com/playing/archive/2011/07/14/2106727.html
 *   注意make组件的安装,该步骤没有截图,但和binutils,gcc,gcc-mingw,gdb
 *   是很类似的
 * 2 检查cygwin是否安装正确
 *   通过命令行进入cygwin 输入cd $NDKROOT,若输出bash_profile中于ndk
 *   配置相关的一行信息则表示安装成功.
 *   注意这里的输入的命令是cd $NDKROOT,所以bash_profile文件中配置的
 *   名称也应是NDKROOT.即两者保持一致
 * 3 编译
 *   3.1 进入cygwin,然后cd,然后空格,然后拖入android工程的完成路径.
 *   例如:$ cd /cygdrive/d/workplace/JNITest
 *   3.2 再执行命令$ $NDKROOT/ndk-build -B
 *   即可生成.so文件
 *
 * 编写与JNI有关的HelloWorld的小例子,参考资料:
 * http://blog.csdn.net/zhangjie201412/article/details/7297899
 * 注意的问题:
 * 1 JNI函数的名称格式
 * Java_完整的Activity路径_方法名
 * 比如此处:
 * jstring Java_c_c_MainActivity_getString(JNIEnv *env,jobject jobj)
 * 该问题在上面的网址中也有提及,要尤其注意
 * 2 利用 System.loadLibrary()载入原生库时
 *  参数为.c文件的名称,比如:
 *  System.loadLibrary("HelloWorld")
 */
public class MainActivity extends Activity {
   private Button mButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
   private void init(){
	   mButton=(Button) findViewById(R.id.button);
	   mButton.setOnClickListener(new OnClickListener() {
		public void onClick(View v) {
			String result=getString();
			Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
		}
	});
   }
   //声明JNI函数函数
   public native String getString();
   //载入原生库
    static {
          System.loadLibrary("HelloWorld");
      }  

}

HelloWorld.c如下:

//HelloWorld.c
#include <string.h>
#include <jni.h>

jstring Java_c_c_MainActivity_getString(JNIEnv *env,jobject jobj)
{
	return (*env)->NewStringUTF(env,"HelloWorld,JNI is good");
}

Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := HelloWorld
LOCAL_SRC_FILES := HelloWorld.c
LOCAL_LDLIBS +=  -llog -ldl

include $(BUILD_SHARED_LIBRARY)

Application.mk.mk如下:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="hello JNI"
         />

</RelativeLayout>

 

时间: 2025-01-26 23:12:50

JNI入门完整详细示例的相关文章

SpringMVC札集(01)——SpringMVC入门完整详细示例(上)

自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理

SpringMVC札集(03)——基于注解的SpringMVC入门完整详细示例

自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理

SpringMVC札集(02)——SpringMVC入门完整详细示例(下)

自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onLayout源码详尽分析 自定义View系列教程04–Draw源码分析及其实践 自定义View系列教程05–示例分析 自定义View系列教程06–详解View的Touch事件处理 自定义View系列教程07–详解ViewGroup分发Touch事件 自定义View系列教程08–滑动冲突的产生及其处理

Android侧滑菜单完整详细示例(精装版)

MainActivity如下: package cn.patience7; import android.os.AsyncTask; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view

CountDownTimer完整详细示例

MainActivity如下: package cc.cv; import android.os.Bundle; import android.os.CountDownTimer; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; /** * Demo示例: * CountDownTimer完整

Android侧滑菜单完整详细示例(基础版)

MainActivity如下: package cc.cd; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.View.OnTouchListener; i

Android侧滑菜单完整详细示例(改进版)

MainActivity如下: package cc.cd; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter;

Android利用Volley异步加载数据完整详细示例(一)

MainActivity如下: package cc.cn; import java.util.HashMap; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.os.Bundle; import com.android.volley.AuthFailureError; import com.android.volley.RequestQ

Android利用Volley异步加载数据完整详细示例(二)

MainActivity如下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageView;