安卓JNI开发,在C代码中回调java的方法
详细的操作方法或具体步骤
创建一个安卓工程
将要在C中调用到的java中的方法封装成一个类
package com.example.jnitest2;
import android.content.Context;
import android.widget.Toast;
public class NativeProviefder {
static{
System.loadLibrary("jnitest2");//这里是加载类库的名子
}
Context context;
//有参数的构造
public NativeProviefder(Context context) {
this.context=context;
}
//无参数的构造
public NativeProviefder() {
super();
}
//空参数的方法的调用
public void showString(){
String string="这是一个空的构造C来调用来显示 ";
System.out.println(string);
Toast.makeText(context, "这是空的==="+string, 0).show();
}
//带有int类型参数的方法的调用
public void adds(int a,int b){
String string="这是这是用来计算加法运算的方法 ,计算结果 是 : ";
int sum=a+b;
System.out.println(string+sum);
Toast.makeText(context, "这是空的==="+sum, 0).show();
}
//带有String类型参数的方法的调用
public void printStrings(String string ){
String strings="这是一个输出打印一个字条 串的 方法 输出 的字符串 为 : ";
System.out.println(strings);
Toast.makeText(context, "printString==="+strings +"::"+string, 0).show();
}
//静态方法的调用
public static void printStaticStrings(){
String strings="printStaticStrings: ";
System.out.println(strings);
}
//C中将要调用的本地方法
public native void showStringNative();
public native void addNative();
public native void printStringNative();
public native void printStringStaticNative() ;
}
在主界面中代码 的实现
package com.example.jnitest2;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
public class HomeActivity extends Activity {
private NativeProviefder nativeProviefder;
static{
System.loadLibrary("jnitest2");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
nativeProviefder=new NativeProviefder(this);
}
//点击调用一个空参数的方法
public void showStringOnclick(View view ){
nativeProviefder.showStringNative();
}
//点击调用一个相加的方法
public void addNumber(View view ){
nativeProviefder.addNative();
}
//点击调用一个打出字符串的方法
public void printString(View view ){
nativeProviefder.printStringNative();
}
//点击调用一个打出字符串的方法
public void printStaticString(View view ){
nativeProviefder.printStringStaticNative();
}
}
相应的配制页面布局文件信息
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".HomeActivity" >
在C代码 中的实现
#include
#include
#include
//回调空参数的方法
JNIEXPORT void JNICALL Java_com_example_jnitest2_NativeProviefder_showStringNative(JNIEnv * env , jobject obj){
// (*FindClass)(JNIEnv*, const char*);
jclass claxx=(*env)->FindClass(env,"com/example/jnitest2/NativeProviefder");
//jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
jmethodID method=(*env)->GetMethodID(env,claxx,"showString","()V");
(*env)->CallVoidMethod(env,obj,method);
}
//回调带int参数的数组
JNIEXPORT void JNICALL Java_com_example_jnitest2_NativeProviefder_addNative(JNIEnv * env , jobject obj){
jclass claxx=(*env)->FindClass(env,"com/example/jnitest2/NativeProviefder");
jmethodID method=(*env)->GetMethodID(env,claxx,"adds","(II)V");
(*env)->CallVoidMethod(env,obj,method,1,2);
}
//回调带String参数的方法
JNIEXPORT void JNICALL Java_com_example_jnitest2_NativeProviefder_printStringNative(JNIEnv * env , jobject obj){
//加载类的字节码
jclass claxx=(*env)->FindClass(env,"com/example/jnitest2/NativeProviefder");
jmethodID method=(*env)->GetMethodID(env,claxx,"printStrings","(Ljava/lang/String;)V");
jstring charst=(*env)->NewStringUTF(env,"yhtjhfhy");
(*env)->CallVoidMethod(env,obj,method,charst);
}
//回调静态方法
JNIEXPORT void JNICALL Java_com_example_jnitest2_NativeProviefder_printStringStaticNative(JNIEnv * env , jobject obj){
//加载类的字节码
jclass claxx=(*env)->FindClass(env,"com/example/jnitest2/NativeProviefder");
jmethodID method=(*env)->GetStaticMethodID(env,claxx,"printStaticStrings","()V");
(*env)->CallVoidMethod(env,obj,method);
}
//调用其他类的方法
//JNIEXPORT void JNICALL Java_com_example_jnitest2_NativeProviefder_printStringStaticNativess
//(JNIEnv * env , jobject obj){
// //加载类的字节码
// jclass claxx=(*env)->FindClass(env,"com/example/jnitest2/NativeProviefder");
// jmethodID method=(*env)->GetStaticMethodID(env,claxx,"printStaticStrings","()V");
// //jobject (*AllocObject)(JNIEnv*, jclass);
// jobject mainobi=(*env)->AllocObject(env,"全类名");
// (*env)->CallVoidMethod(env,mainobi,method);
//}
对应的 Android.mk文件中
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=jnitest2
LOCAL_SRC_FILES :=jnitest2.c
include $(BUILD_SHARED_LIBRARY)
//适配的机型设置
APP_ABI :=x86 armeabi
# 去掉警告
APP_PLATFORM :=android-8







- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
