标签:
MainActivity:
package com.itheima.helloworld1; import android.os.Bundle; import android.app.Activity; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { static{ //加载打包完毕的so类库 System.loadLibrary("hello");//hello是Abdroid.mk中指定的名字。 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /*##使用jni 1. 在项目根目录下创建jni文件夹 2. 在jni文件中创建一个c文件(src是写java代码的) 3. 在java代码中,创建一个本地方法helloFromC public native String helloFromC(); 4. 在jni中定义函数实现这个方法,函数名必须为 jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj) 5. 返回一个字符串,用c定义一个字符串 char* cstr = "hello from c"; 6. 把c的字符串转换成java的字符串 jstring jstr = (*env)->NewStringUTF(env, cstr); return jstr; 7. 在jni中创建Android.mk文件 8. 在c文件中添加<jni.h>头文件 9. 在jni文件夹下执行ndk-build.cmd指令( 在磁盘jni文件夹下用cmd命令编译,编译完后在libs下的armeabi文件夹下有一个libhello.so文件,这就是编译后的c代码) 10. java代码中加载so类库,调用本地方法*/ public void click(View v){ Toast.makeText(this, helloFromC(), 0).show(); } //定义一个本地方法,方法体由c语言实现 public native String helloFromC(); }
Android.mk
# mk是make的意思 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #编译后生成的文件的类库叫什么名字 LOCAL_MODULE := hello #要编译的c文件 LOCAL_SRC_FILES := Hello.c include $(BUILD_SHARED_LIBRARY)
Hello.c
#include <stdio.h> #include <stdlib.h> #include <jni.h> //jstring表示string,Java_com_itheima_helloworld1_MainActivity_helloFromC是包名类名方法名 //JNIEnv* env, jobject obj是必须写的参数,env是java虚拟机的内存地址,java代码是运行在虚拟机的而C代码不是运行在虚拟机的, //env本来就是一个结构体指针,此处* env是一个java运行环境的二级指针,obj是MainActivity对象,C中jobject表示对象。 jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj){ //c语言的字符串不是string,是字符数组,char* cstr或者char cstr[],数组的名字就是第0个元素的地址, char* cstr = "hello from c"; //把C语言的字符串转换成java的字符串 // jstring (*NewStringUTF)(JNIEnv*, const char*); // jstring jstr = (*(*env)).NewStringUTF(env, cstr); jstring jstr = (*env)->NewStringUTF(env, cstr); return jstr; }
标签:
原文地址:http://www.cnblogs.com/yaowen/p/4986806.html