JNI之HelloWorldFormC
来源:互联网 发布:seo研究中心黄聪 编辑:程序博客网 时间:2024/05/11 19:07
我们来实现下在java代码中调用C代码。
首先第一步:在eclipse中创建HelloWorldFormC的android项目,然后在HelloWorldFormCActivity中定义一个C方法的接口:
import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class HelloWorldFormCActivity extends Activity { //1.定义一个C方法的接口,相当于在java代码中定义了一个接口,接口的实现方法是C语言 public native String helloWorldFormC(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
第二步:实现C代码,在项目下新建Folder命名为jni,在jni内新建File文件 例如Hello.c
c代码如下:
#include <stdio.h>#include <jni.h>jstring Java_com_xiaomai_HelloWorldFormCActivity_helloWorldFormC(JNIEnv* env,jobject obj){// 返回一个java String 类型的字符串//jstring (*NewStringUTF)(JNIEnv*, const char*);//(*env) 相当于 JNINativeInterface* JNIEnv//*(*env) 相当于 JNINativeInterface//return (**env).NewStringUTF(env,"helloworldfromc");return (*env)->NewStringUTF(env, "helloworldfromc");}jni.h是java虚拟机在如下目录中
可以这个文件中找到我们写程序时需要的一些C方法接口;
第三步 生成android.mk文件,android.mk是C代码和java代码关联的脚本语言,作用是告诉编译器如何把C代码打包成函数库给java使用。
打开这个html中有介绍android.mk
我们拷贝使用如下这段代码:
在jni目录下新建android,mk文件,android,mk中代码如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #对应的打包成函数库的名字 LOCAL_MODULE := hello #对应的c代码的文件 LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
第四步 把C代码打包成函数库:先cygwin切换到HelloWorldFormC工程目录下然后执行ndk-build
执行完成后刷新项目会看到如下一些文件
hello.o是hello.c的中间文件,android把hello.o文件进行优化成hello.o.d文件,然后这个文件打包后生成的就是armeabi目录下的libhello.so文件(armeabi的意思是 arme cup android binary interface);
第五步 在java代码中引入库函数
import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class HelloWorldFormCActivity extends Activity { //1.定义一个C方法的接口,相当于在java代码中定义了一个接口,接口的实现方法是C语言 public native String helloWorldFormC(); //5.在java代码中引入库函数 static{ System.loadLibrary("hello");//去掉前面的lib和后面的.so。 } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void click(View view){ Toast.makeText(getApplicationContext(), helloWorldFormC(), 0).show(); }}
android的布局文件main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:onClick="click" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /></LinearLayout>
最后运行下程序结果如下:
0 0
- JNI之HelloWorldFormC
- JNI之Hello-JNI进阶
- JNI开发之JNI简介
- JNI开发之JNI原理
- JNI开发之JNI实践
- JNI 之 hello world
- JNI之拍案惊奇
- android之JNI
- Android 之 JNI
- android之JNI
- JNI之helloworld
- NDK 之 JNI数据类型
- NDK 之 JNI数据传输
- android之jni
- android之JNI初步
- jni之JNIEnv*
- JAVA之JNI小结
- Android学习之 JNI
- easyui 日期约束-当前日期以后不可选中
- android设置背景色或者主题
- C语言 认识转换符 fscanf()用法
- 开灯问题
- [C/C++程序员面试宝典] 程序员面试宝典(33)-在O(1)时间删除链表结点
- JNI之HelloWorldFormC
- java那些事之对象导论
- 即将到来的场景时代
- Matlab特征值和特征向量--将特征值按从大到小的顺序排列
- 深入浅出多线程系列之七:4种定时器
- DOS简易版C语言贪吃蛇
- 6st
- 题目1512:用两个栈实现队列
- Struts2 Action/动作