JNI-->C调用Java语言
2015-03-11 16:31
239 查看
布局文件
MainActivity.java
JNI.java
接下来是jni文件夹中的文件
Android.mk
com_atguigu_ccalljavademo_JNI.h
(通过javah 生成,在拖拽过来)
atguigu.c
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:onClick="CCallJava_helloFromJava" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="C代码调用JNI中的helloFromJava" /> <Button android:onClick="CCallJava_add" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="C代码调用JNI中的add" /> <Button android:onClick="CCallJava_printString" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="C代码调用JNI中的printString" /> <Button android:onClick="CCallJava_staticMethed" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="C代码调用JNI中的静态方法" /> </LinearLayout>
MainActivity.java
package com.atguigu.ccalljavademo; import android.app.Activity; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { private JNI jni; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); jni = new JNI(); } //点击事件 public void CCallJava_helloFromJava(View view){ jni.ccallJava_helloFromJava(); } public void CCallJava_add(View view){ jni.ccallJava_add(); } public void CCallJava_printString(View view){ jni.ccallJava_printString(); } public void CCallJava_staticMethed(View view){ jni.ccallJava_sayHello(); } }
JNI.java
package com.atguigu.ccalljavademo; public class JNI { { System.loadLibrary("atguigu"); } /** * C调用java空方法 */ public void helloFromJava() { System.out.println("我是java代码中的JNI.java中的helloFromJava()方法,我被C调用了"); } /** * C调用java中的带两个int参数的方法 */ public int add(int x, int y) { int result = x + y; System.out.println("我是java代码中的JNI.java中的int add(int x,int y)方法,我被C调用了:" + result); return result; } /** * C调用java中参数为string的方法 * java -String -jstring-char* */ public void printString(String s) { System.out .println("我是java代码中的JNI.java中的printString(String s)方法,我被C调用了:" + s); } /** * 静态方法 */ public static void sayHello(String s){ System.out .println("我是java代码中的JNI.java中的sayHello(String s)静态方法,我被C调用了:" + s); } /** *让C代码调用Java代码中的JNI的helloFromJava()方法 */ public native void ccallJava_helloFromJava(); /** *让C代码调用Java代码中的JNI的add(int x, int y)方法 */ public native void ccallJava_add(); /** *让C代码调用Java代码中的JNI的printString(String s)方法 */ public native void ccallJava_printString(); /** *让C代码调用Java代码中的JNI的sayHello(String s)静态方法 */ public native void ccallJava_sayHello(); }
接下来是jni文件夹中的文件
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := atguigu LOCAL_SRC_FILES := atguigu.c include $(BUILD_SHARED_LIBRARY)
com_atguigu_ccalljavademo_JNI.h
(通过javah 生成,在拖拽过来)
atguigu.c
#include "com_atguigu_ccalljavademo_JNI.h" #include<stdio.h> #include<stdlib.h> /** *让C代码调用Java代码中的JNI的helloFromJava()方法 */ JNIEXPORT void JNICALL Java_com_atguigu_ccalljavademo_JNI_ccallJava_1helloFromJava( JNIEnv * env, jobject jobj) { //1.得到字节码 jclass (*FindClass)(JNIEnv*, const char*); //2.得到对应的方法 (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); //倒数第二个参数:方法名;最后一个参数:方法签名 //F:\dianping\06.CCallJavaDemo\bin\classes>javap -s com.atguigu.ccalljavademo.JNI //3.得到实例 jobject (*AllocObject)(JNIEnv*, jclass); //4.调用 void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); jclass jclazz = (*env)->FindClass(env, "com/atguigu/ccalljavademo/JNI"); jmethodID jmethodIDs = (*env)->GetMethodID(env, jclazz, "helloFromJava","()V"); jobject jobjects = (*env)->AllocObject(env, jclazz); (*env)->CallVoidMethod(env, jobjects, jmethodIDs); } /** *让C代码调用Java代码中的JNI的add(int x, int y)方法 */JNIEXPORT void JNICALL Java_com_atguigu_ccalljavademo_JNI_ccallJava_1add( JNIEnv * env, jobject jobj) { //1.得到字节码 jclass (*FindClass)(JNIEnv*, const char*); //2.得到对应的方法 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); //倒数第二个参数:方法名 //最后一个参数:方法签名 //3.得到实例 jobject (*AllocObject)(JNIEnv*, jclass); //4.调用 jint (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...); jclass jclazz = (*env)->FindClass(env, "com/atguigu/ccalljavademo/JNI"); jmethodID jmethodIDs = (*env)->GetMethodID(env, jclazz, "add", "(II)I"); jobject jobjects = (*env)->AllocObject(env, jclazz); int x = 99; int y = 100; (*env)->CallIntMethod(env, jobjects, jmethodIDs, x, y); //成功调用了java代码中的JNI类中的add方法 } /** *让C代码调用Java代码中的JNI的printString(String s)方法 */JNIEXPORT void JNICALL Java_com_atguigu_ccalljavademo_JNI_ccallJava_1printString( JNIEnv * env, jobject jobj) { //1.使用反射实例化,并调用add方法 jclass (*FindClass)(JNIEnv*, const char*); //2.得到对应的方法 jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); //倒数第二个参数:方法名 //最后一个参数:方法签名 //3.得到实例 jobject (*AllocObject)(JNIEnv*, jclass); //4.调用 void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); jclass jclazz = (*env)->FindClass(env, "com/atguigu/ccalljavademo/JNI"); jmethodID jmethodIDs = (*env)->GetMethodID(env, jclazz, "printString", "(Ljava/lang/String;)V"); jobject jobjects = (*env)->AllocObject(env, jclazz); jstring jstr = (*env)->NewStringUTF(env, "I am from C ...."); (*env)->CallVoidMethod(env, jobjects, jmethodIDs, jstr); //成功调用了java代码中的JNI类中的printString方法 } /** *让C代码调用Java代码中的JNI的sayHello(String s)静态方法 */JNIEXPORT void JNICALL Java_com_atguigu_ccalljavademo_JNI_ccallJava_1sayHello( JNIEnv * env, jobject jobj) { //1.使用反射实例化,并调用add方法 jclass (*FindClass)(JNIEnv*, const char*); //2.得到对应的方法 jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*); //倒数第二个参数:方法名 //最后一个参数:方法签名 //3.得到实例 jobject (*AllocObject)(JNIEnv*, jclass); //jobject jobjects= (*env)->AllocObject(env,jclazz); //4.调用 void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...); jclass jclazz = (*env)->FindClass(env, "com/atguigu/ccalljavademo/JNI"); jmethodID jmethodIDs = (*env)->GetStaticMethodID(env, jclazz, "sayHello", "(Ljava/lang/String;)V"); jstring jstr = (*env)->NewStringUTF(env, "I am from C static...."); (*env)->CallStaticVoidMethod(env, jclazz, jmethodIDs, jstr); //成功调用了java代码中的JNI类中的sayHello(String s)静态方法 }
相关文章推荐
- JNI-->Java调用C语言
- JNI方法调用C++类库<一>
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI调用c/c++,env->和(*env)->是有区别的
- JNI方法调用C++类库 <二>
- 学习android JNI的那些事儿--------5. Field & Method --> Accessing Mehtod
- 编写一个方法,计算kkk^^kk (共n个k,n>0)的值。例如k=2,n=5则为22222。调用方法求s1=6+66+666+6666+66666
- Dom元素+闭包+循环调用+js移除对象+IE6/7 --> 内存泄漏
- JNI之一:基础 && JAVA调用win dll实例
- .NET调用osql.exe执行sql脚本创建表和存储过程<转> 代码
- Android平台添加外设的架构流程(kernel->HAL->JNI->API->APP)之学习提高篇
- <转载学习>子类对父类构造方法调用小结
- <转>java jsp JXL调用模版导出Excel
- JNI中用 javah.exe 产生头JNI-Style文件出现错误:无法访问 <class> 未找到 <class> 的类文件
- <input>回车后调用JS进行指定操作
- 学习android JNI的那些事儿--------4. Field & Method --> Accessing Field
- Control Study -> 用Process调用其它应用程序
- 调用本文的数据库操作基类-->http://www.opent.cn/a/2009/2/4/830.shtml
- WM_KEYDOWN --> 调用TranslateMessage --> WM_CHAR --> WM_KEYUP 分析WM_CHAR
- Control Study -> 用Process调用其它应用程序