您的位置:首页 > 编程语言 > Java开发

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

2015-07-15 21:23 465 查看
本节使用辅助类实现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() {
@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 jni Android c++