如何使用JNI更改Java类的字段 [英] how to use the JNI to change the fields of a java class

查看:58
本文介绍了如何使用JNI更改Java类的字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用c本机函数来更改java类的整数字段.基本上,我想看看如何使用JNI来实现按引用调用.但是我收到错误消息没有为本地人找到实现".谁能帮我解决这个问题.我是android和java的新手.以下是我编写的代码.如果有人可以更改此设置以满足我的要求,我一定会感谢他的帮助.

I am using a c native function to change the integer fields of a java class. Basically i want to see how the call by reference can be implemented using JNI. But i am getting the error "No Implementaion found for native". Can anybody help me to solve this problem. I am new to android and java. Below are the codes that i have written. If anybody can change this to satisfy what i want i will definitely appreciate him for help.

java代码:

class myclass { 

    int a = 1;
    int b = 2;
    public native void callTochangeJNI();

    static {
        System.loadLibrary("sum_jni");
    }
}

public class sum extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sum);
        myclass myobject = new myclass(); 
        System.out.println("calling the jni native method");
        myobject.callTochangeJNI();
        System.out.println("returned from jni native method one");
        myobject.callTochangeJNI();
        System.out.format(" a = %d%n....", myobject.a);
        System.out.format("b =  %d%n...", myobject.b);
    }
}   

c本机方法:

void Java_com_kpit_myfirstndkapp_sum_callTochangeJNI(JNIEnv* env, jobject obj )
{

    jfieldID fid;
    jmethodID mid;
    jclass myclass;

    printf(" Inside the JNI native method \n");

    jclass localRefCls = (*env)->FindClass(env, "java/lang/String");
    myclass = (*env)->NewGlobalRef(env, localRefCls);

    fid = (*env)->GetFieldID(env,myclass," a ","I");
    (*env)->SetIntField(env, obj ,fid,3);

    fid = (*env)->GetFieldID(env,myclass," b ","I");
    (*env)->SetIntField(env, obj ,fid,4);

}

下面是我得到的日志:

07-25 09:33:07.723: D/dalvikvm(573): Trying to load lib /data/da/com.kpit.myfirstndkapp /lib/libsum_jni.so 0x4129d7b8
07-25 09:33:07.723: D/dalvikvm(573): Added shared lib /data/data/com.kpit.myfirstndkapp/lib/libsum_jni.so 0x4129d7b8
07-25 09:33:07.723: D/dalvikvm(573): No JNI_OnLoad found in /data/data/com.kpit.myfirstndkapp/lib/libsum_jni.so 0x4129d7b8, skipping init
07-25 09:33:07.723: I/System.out(573): calling the jni native method
07-25 09:33:07.723: W/dalvikvm(573): No implementation found for native Lcom/kpit/myfirstndkapp/myclass;.callTochangeJNI ()V
07-25 09:33:07.733: I/dalvikvm(573): Wrote stack traces to '/data/anr/traces.txt'
07-25 09:33:07.804: D/AndroidRuntime(573): Shutting down VM
07-25 09:33:07.804: W/dalvikvm(573): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
07-25 09:33:07.854: E/AndroidRuntime(573): FATAL EXCEPTION: main
07-25 09:33:07.854: E/AndroidRuntime(573): java.lang.UnsatisfiedLinkError: callTochangeJNI
07-25 09:33:07.854: E/AndroidRuntime(573):  at com.kpit.myfirstndkapp.myclass.callTochangeJNI(Native Method)
07-25 09:33:07.854: E/AndroidRuntime(573):  at com.kpit.myfirstndkapp.sum.onCreate(sum.java:27)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.Activity.performCreate(Activity.java:4465)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.os.Looper.loop(Looper.java:137)
07-25 09:33:07.854: E/AndroidRuntime(573):  at android.app.ActivityThread.main(ActivityThread.java:4424)
07-25 09:33:07.854: E/AndroidRuntime(573):  at java.lang.reflect.Method.invokeNative(Native Method)
07-25 09:33:07.854: E/AndroidRuntime(573):  at java.lang.reflect.Method.invoke(Method.java:511)
07-25 09:33:07.854: E/AndroidRuntime(573):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-25 09:33:07.854: E/AndroidRuntime(573):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-25 09:33:07.854: E/AndroidRuntime(573):  at dalvik.system.NativeStart.main(Native Method)
07-25 09:33:08.234: I/dalvikvm(573): threadid=3: reacting to signal 3
07-25 09:33:08.264: I/dalvikvm(573): Wrote stack traces to '/data/anr/traces.txt'
07-25 09:33:08.554: I/dalvikvm(573): threadid=3: reacting to signal 3
07-25 09:33:08.623: I/dalvikvm(573): Wrote stack traces to '/data/anr/traces.txt'
07-25 09:38:07.994: I/Process(573): Sending signal. PID: 573 SIG: 9

请帮助我

推荐答案

您的C方法的名称和签名错误,名称必须为Java_PackageName_ClassName_CfunctionName

The name and signature of your C method is wrong, the name must be Java_PackageName_ClassName_CfunctionName

如果从名为MyClass的类中调用它,并且其包名称为com.kpit.myfirstndkapp,则必须将您的方法声明为

If you call it from a class named MyClass and its package name is com.kpit.myfirstndkapp then your method must be declared as

 JNIEXPORT void JNICALL Java_com_kpit_myfirstndkapp_MyClass_callToChangeJNI(...)

这篇关于如何使用JNI更改Java类的字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆