怎么又是这个问题,参考一些吧:
http://hi.baidu.com/gaogaf/item/c2165abf1a073b42bb0e1240

解决方案 »

  1.   

    你的方法我看了。不是这个原因。而且出错的log也不一样。
    我是写了一个service。
    这个service在java层通过jni中一个函数的时候
    调用instantiate()加入servicemanager中。
    其中instantiate()中有一个 android::defaultServiceManager()->addService(IMyService::descriptor, myService);
    就是在调用这个的时候报错。
    报的错是:add_service('android.JNI.MyService',0x3d) uid=10004 - PERMISSION DENIED 
    我目前尝试的方法是 修改Androidmanifest。但是不知道修改的恰不恰当。
    <uses-permission android:name="android.permission.ADD_SYSTEM_SERVICE" ></uses-permission>
      <activity
      ................................................................................
      android:sharedUserId="android.uid.system" >
      </activity>
    还有一种方法,就是将我写的service放入到init.rc中。在系统启动的时候,就开启服务。当时这种方法我正在做。
    所以这里求高手帮忙。感谢。真心感谢。我纠结了6天了。谢谢!!!真心向高手学习。谢谢!
    谢谢!
      

  2.   

    jellybean:
    http://developer.android.com/sdk/api_diff/4/changes/android.Manifest.permission.html
    看样子删了frameworks/base/cmds/servicemanager/service_manager.cint svc_can_register(unsigned uid, uint16_t *name)
    {
        unsigned n;    if ((uid == 0) || (uid == AID_SYSTEM))
            return 1;    for (n = 0; n < sizeof(allowed) / sizeof(allowed[0]); n++)
            if ((uid == allowed[n].uid) && str16eq(name, allowed[n].name))
                return 1;    return 0;
    }
    另外不用喊高手低手的,大家知道的就会告诉你
      

  3.   

    多谢,
    我现在是把这个service加入到init.rc中,
    我调用的时候报了这个错误:
        Waiting for service android.myclient.IMyClient...
    我的addservice是这样写的
    int main(int argc, char** argv) {
    sp<IServiceManager> sm = defaultServiceManager();
        MyService::instantiate();//初始化MyService服务
         ProcessState::self()->startThreadPool();//看名字,启动Process的线程池    
    IPCThreadState::self()->joinThreadPool();//将自己加入到刚才的线程池    
    }
    能不能帮我看看,android.myclient.IMyClient是名字,这里主要就是发现它会在等待,然后整个界面就起不来了。
    求帮忙!
      

  4.   

    我想继续在这个上面问一个问题。
      1 。我在 a.h 中定义了JNIEnv   *Jenv; 和 jobject  Jobj ;这2个变量是我用来C++调用java 必须要的。  2。我在b_jni.cpp 中引入  a.h并且
          extern JNIEnv   *Jenv;
         extern jobject  Jobj ;
         在这个b_jni.cpp中对它们赋值。
      3. 在  c.cpp 中引入 a.h 调用 并且使用到了 Jenv和 Jobj的一些方法。  这是我判断了Jenv。
          结构发现每次  Jenv 都是  NULL。
      请问有什么好的方法,能使这个Jenv 和 Jobj 被b_jni.cpp中赋值了,然后再c.cpp中被我调用,而不是NULL。这里有一点说明,我每次都是先执行第二步中的赋值,才执行第三部。
          或者有什么好的方法能够传递JNIEnv和jobject。  
      

  5.   

    1. 如果你要用全局变量,不要在头文件中定义它,而是声明它extern JNIEnv *Jenv;,
    或者你可以在b.cpp中定义它:
    JNIEnv *Jenv = null;并赋值
    然后再c.cpp中声明它:
    extern JNIEnv *Jenv;
    就可以用了。
    2. 或者你在c.cpp中
    static JNIEnv *Jenv = null;
    然后提供一个函数让b设置过来。
      

  6.   

    嗯,谢谢,我刚跟老大谈了,这个方法行不通。
    jnienv 是不能再2个进程之间传递,
    我写的service就是一个进程。
    然后xx_jni.so 也是运行的一个在apk调用的时候的一个进程。
    所以,这种方法不行。
    我想问一下。java层能不能启动有binder机制的一个service。直接和我写的service通信。使得我的数据能够直接传递给java层?
      

  7.   

    java 和 c++ 通过 binder机制、能不能通过jni??