Jni 简单实战 c调用java静态方法

来源:互联网 发布:刺客信条4低配优化 编辑:程序博客网 时间:2024/06/05 16:43

本节使用辅助类实现c调用java静态方法

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() {@Overridepublic 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;@Overrideprotected 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



0 0
原创粉丝点击