本节使用辅助类实现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