Androidmanifest.xml 中遇到的问题

yikesong321 2012-09-25 07:46:33
高手:
你好,
本人在执行apk的时,查看logcat,然后出现
add_service('android.JNI.MyService',0x3d) uid=10004 - PERMISSION DENIED 这个问题。
这个android.JNI.MyService是我写的,应该没什么问题。
我也在androidmanifest.xml中添加了。
<uses-permission android:name="android.permission.ADD_SYSTEM_SERVICE" ></uses-permission>
<activity
................................................................................
android:sharedUserId="android.uid.system" >
</activity>
这个我觉得添加的应该是对的。求高手帮我看看。

我在执行中,就会报错。 add_service('android.JNI.MyService',0x3d) uid=10004 - PERMISSION DENIED 。。。

这里求高手帮忙。感谢。真心感谢。我纠结了5天了。谢谢!!!真心向高手学习。谢谢!
谢谢!
...全文
643 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuailelilin 2014-02-13
  • 打赏
  • 举报
回复
楼主怎么解决第一个问题的?分享一下啊?
yikesong321 2012-09-28
  • 打赏
  • 举报
回复
java 和 c++ 通过 binder机制、能不能通过jni??
yikesong321 2012-09-28
  • 打赏
  • 举报
回复
求帮助!
yikesong321 2012-09-28
  • 打赏
  • 举报
回复
嗯,谢谢,我刚跟老大谈了,这个方法行不通。
jnienv 是不能再2个进程之间传递,
我写的service就是一个进程。
然后xx_jni.so 也是运行的一个在apk调用的时候的一个进程。
所以,这种方法不行。
我想问一下。java层能不能启动有binder机制的一个service。直接和我写的service通信。使得我的数据能够直接传递给java层?
oyq_yangy 2012-09-28
  • 打赏
  • 举报
回复
1. 如果你要用全局变量,不要在头文件中定义它,而是声明它extern JNIEnv *Jenv;,
或者你可以在b.cpp中定义它:
JNIEnv *Jenv = null;并赋值
然后再c.cpp中声明它:
extern JNIEnv *Jenv;
就可以用了。
2. 或者你在c.cpp中
static JNIEnv *Jenv = null;
然后提供一个函数让b设置过来。
yikesong321 2012-09-28
  • 打赏
  • 举报
回复
我想继续在这个上面问一个问题。
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。

yikesong321 2012-09-28
  • 打赏
  • 举报
回复
嗯,解决了。谢谢吧。什么都要靠自己。唉。。
yikesong321 2012-09-27
  • 打赏
  • 举报
回复
好吧。第七天。。。。。。。。
xhl101711 2012-09-27
  • 打赏
  • 举报
回复
好吧,快放假了,你可以带着这个问题过节了!
yikesong321 2012-09-27
  • 打赏
  • 举报
回复
多谢,
我现在是把这个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是名字,这里主要就是发现它会在等待,然后整个界面就起不来了。
求帮忙!
oyq_yangy 2012-09-27
  • 打赏
  • 举报
回复
jellybean:
http://developer.android.com/sdk/api_diff/4/changes/android.Manifest.permission.html
看样子删了

frameworks/base/cmds/servicemanager/service_manager.c

int 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;
}


另外不用喊高手低手的,大家知道的就会告诉你。。。
zy1235678 2012-09-26
  • 打赏
  • 举报
回复
怎么又是这个问题,参考一些吧:
http://hi.baidu.com/gaogaf/item/c2165abf1a073b42bb0e1240
yikesong321 2012-09-26
  • 打赏
  • 举报
回复
你的方法我看了。不是这个原因。而且出错的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天了。谢谢!!!真心向高手学习。谢谢!
谢谢!

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧