Jni 简单实战 c调用java静态方法
2015-07-15 21:23
465 查看
本节使用辅助类实现c调用java静态方法
1、新建CCallJava.java文件
2、编写MainActivity.java
3、在jni文件夹下新建CCallJava.cpp、CCallJava.h文件
编写CCallJava.h
编写CCallJava.cpp
如果 "com/hym/jni/CCallJava","getSay","(Ljava/lang/String;)V" 信息不会填写可以查看
编写JavaCallC++.cpp
运行程序会出现 hello From C
1、新建CCallJava.java文件
<span style="font-size:14px;">public class CCallJava { public static TextView myTestTV =null; public static Activity myActivity=null; public static void getSay(String str){ final String say=str; myActivity.runOnUiThread(new Runnable() { @Override public void run() { myTestTV.setText(say); } }); } public static void setTestTV(TextView testTV){ myTestTV=testTV; } public static void setActivity(Activity activity){ myActivity=activity; } }</span>
2、编写MainActivity.java
<span style="font-size:14px;">public class MainActivity extends Activity { public static native String getStringFromC(); public static native void setClassLoaderFromInstance(Object obj); public static native void cCallJava(); static{ System.loadLibrary("jniStudy"); } private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=(TextView) findViewById(R.id.textview); CCallJava.setActivity(this); CCallJava.setTestTV(textView); textView.setText(getStringFromC()); setClassLoaderFromInstance(this); cCallJava(); } }</span>
3、在jni文件夹下新建CCallJava.cpp、CCallJava.h文件
编写CCallJava.h
<span style="font-size:14px;">#ifndef JNI_CCALLJAVA_H_ #define JNI_CCALLJAVA_H_ extern void say(); #endif /* JNI_CCALLJAVA_H_ */</span>
编写CCallJava.cpp
<span style="font-size:14px;">#include "CCallJava.h" #include "MyJniHelper.h" using namespace Hym; void say(){ JniMethodInfo t; if(MyJniHelper::getStaticMethodInfo(t,"com/hym/jni/CCallJava","getSay", "(Ljava/lang/String;)V")){ jstring str; str=t.env->NewStringUTF("hello From C"); t.env->CallStaticVoidMethod(t.classID,t.methodID,str); t.env->DeleteLocalRef(str); t.env->DeleteLocalRef(t.classID); } }</span>
如果 "com/hym/jni/CCallJava","getSay","(Ljava/lang/String;)V" 信息不会填写可以查看
java jni eclipse javap 函数签名
4、生成native头文件 com_hym_jni_MainActivity.h编写JavaCallC++.cpp
<pre name="code" class="java"><span style="font-size:14px;">#include "com_hym_jni_MainActivity.h" #include "MyJniHelper.h" #include "CCallJava.h" JNIEXPORT jstring JNICALL Java_com_hym_jni_MainActivity_getStringFromC (JNIEnv *env, jclass){ return env->NewStringUTF("hello jni!"); } JNIEXPORT void JNICALL Java_com_hym_jni_MainActivity_setClassLoaderFromInstance (JNIEnv *, jclass, jobject obj){ Hym::MyJniHelper::setClassLoaderFromInstance(obj); } JNIEXPORT void JNICALL Java_com_hym_jni_MainActivity_cCallJava (JNIEnv *, jclass){ say(); }</span>
运行程序会出现 hello From C
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译