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

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值