Tag: java的

一旦安装了应用程序,Android原生库就会消失

切换到Android Studio后,我开始看到可怕的 java.lang.UnsatisfiedLinkError: dlopen failed: library ‘/data/app-lib/com.myapp.test-1/libmylib.so’ not found 错误。 当我解压缩apk时,我可以看到libmylib.so以及lib / armeabi文件夹下的所有其他本机库(libmyotherlib.so和libtest.so),所以打包不应该是问题…我决定root我的测试设备,并检查我的应用程序的文件夹/ data / app-lib下的实际内容,其中的本机库应该在安装后 – 我发现应用程序后我的应用程序的本机库之一(libmylib.so)丢失了安装在设备上。 libmylib.so和libmyotherlib.so是预先构建的.so文件放在src / main / jniLibs中,而libtest.so是从test.c在src / main / jni中编译的。 这只是在我切换到Android Studio后才开始的; 我已经validation了在Eclipse ADT中使用相同代码构建的apks在安装后在/data/app-lib/com.myapp.test-1下提供了所有必需的库。 Android Studio版本的相关build.gradle: apply plugin: ‘com.android.application’ android { compileSdkVersion 23 buildToolsVersion “21.1.2” defaultConfig { applicationId “com.myapp.test” minSdkVersion 17 targetSdkVersion 23 versionCode 1 versionName “1.0” ndk{ […]

在JNI调用中调用getFilesDir()时出现NullPointerException

我试图通过JNI调用从C库调用Java的getFilesDir(),并且我遇到了一个我不理解的NullPointerException。 这是例外: W/System.err( 1576): java.lang.NullPointerException W/System.err( 1576): at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) W/System.err( 1576): at MYService.getFilesDirPath(MYService.java:1150) W/System.err( 1576): at MYService.UtvGetPeristentPath(Native Method) 问题出现在这个函数中: public String getFilesDirPath() { try { return getFilesDir().getPath(); // <— Exception happens here! } catch(Exception e) { e.printStackTrace(); Log.e("DEBUG", "getFilesDirPath set exception", e); return null; } } JNI调用设置了一些由JNI_OnLoad设置的静态变量: static JavaVM *s_jvm = NULL; static jclass cls; […]

分配给Out paramaeter时,Android Render Script Error

我收到了错误 Fatal signal 11 (SIGSEGV) at 0x51b71000 (code=1), thread 3696 (sssist.magnitab) 每当我为out参数赋值给发送回值主app时,当我删除赋值错误消失时,这里是我的代码,(下面是android代码部分) void root(const char *in, int *out, uint32_t x, uint32_t y) {\ int pixelData[size]; for (int i = 0; i <size ; i += 16) { //rsDebug("—————:","3333"); int lumOne = in[i]; lumOne += 128; pixelData[lumOne]=pixelData[lumOne]+1; int lumTwo = in[i+2]; lumTwo += 128; //pixelData[lumTwo]++; pixelData[lumTwo]=pixelData[lumTwo]+1; […]

隐藏在混淆代码中的字符串

我只是使用proguard对我的Android代码进行了混淆,然后对其进行了反编译。 有许多字符串我真的想隐藏在窥探的眼睛里。 当我反编译我的代码时,每个人都可以看到字符串……并进行更改。 其中一个字符串是我的许可服务器的URL,它们实际上可以将URL更改为指向虚假服务器(因为我将向公众发布服务器代码)。 隐藏此类信息的最佳方法是什么? 另外,我注意到R类字符串都是随机数,但我在反编译代码中找不到R类。 它在哪里? 我看到的敌人示例 : new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt); 2130903058是一个布局文件,但它引用了什么? 除非它指向某种地址,否则该数字没有任何意义。

如何在NDK上使用Android上的C函数

我想在Android应用程序中使用C语言编写的函数。 该function取自此处 。 我已经学会了android NDK的一些基础知识,我可以设法在我的Java源码中使用该函数,但是当我调用它时应用程序冻结,而不是等到android让我杀死应用程序。 JNI签名是这样的: JNIEXPORT void JNICALL Java_pda_lupa_callbacks_MySurfaceCallback_NativeYuv2rgb (JNIEnv *env, jclass clazz, jbyteArray imageIn, jint widthIn, jint heightIn, jobject imageOut, jint widthOut, jint heightOut) { jbyte *cImageIn = (*env)->GetByteArrayElements(env, imageIn, NULL); jbyte *cImageOut = (jbyte*)(*env)->GetDirectBufferAddress(env, imageOut); toRGB565((unsigned short*)cImageIn, widthIn, heightIn, (unsigned int*)cImageOut, widthOut, heightOut); (*env)->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT); } 然后我像这样在Java中加载它: static { System.loadLibrary(“rgb”); […]

Android NativeActivity – 拦截Java级别的输入

有没有办法在NativeActivity中将输入拦截到本机代码中的AInputQueue之前? 我需要在Java中拦截输入的原因是支持我无法使用任何android/input.h函数捕获的游戏手柄/操纵杆事件,即。 MotionEvent.getAxisValue(MotionEvent.AXIS_RZ) 。 以下内容不起作用(我的清单正确指向我派生的NativeActivity类): public class CustomNativeActivity extends NativeActivity { private View.OnTouchListener touchListener = new View.OnTouchListener() { public boolean onTouch (View v, MotionEvent event) { // This is never called! System.out.println(“onTouch”); return false; } }; public void setContentView(View view) { // This method is called, but registering a touch listener does nothing! view.setOnTouchListener(touchListener); super.setContentView(view); […]

在multithreading应用程序中使用JNI的正确方法

描述 在我的C ++应用程序类JNIXMLDocument中进行了一些JAVA方法调用。 在JNIXMLDocument类的构造函数中,我附加当前线程并将其设置为我的类成员JNIEnv* m_JavaEnv ,然后在所有方法中使用它。 同样在构造函数中,我试图找到我的JAVA类com/fido/android/framework/service/XMLDOMDocument并将其设置为类成员m_XMLDocumentClass并从类中获取该类对象并将其设置为类成员m_XMLDocumentObject 。 C ++代码 class JNIXMLDocument { /* Constructor **/ JNIXMLDocument() { /* Get JNI right version and set it. **/ jint interface_id = JNI_VERSION_1_2; #ifdef JNI_VERSION_1_2 interface_id = JNI_VERSION_1_2; #else interface_id = JNI_VERSION_1_1; #endif /* Trying to attach current thread. **/ int res = g_JavaVirtualMachine->GetEnv(&m_JavaEnv, interface_id); if (res […]

从C代码创建JAVA类

我在Java中有一个名为XMLDOMDocument类,这个类有一些方法CreateXML , AddNode , RemoveNode等。我在Java Native Interface的帮助下从C代码调用这个方法,但为了做到这一点,我传递给了我的JAVA类的C代码对象然后通过调用env->GetObjectClass(myclass)我从该对象获取我的类并调用JAVA类的方法。 我想知道我可以做同样的事情(调用JAVA方法)而不将我的类传递给C代码。 我可以在C代码中创建JAVA类,然后调用它的方法。 编辑 如果我的C代码中有JavaVM,我可以借助该Java VM在C代码中创建一个新的JAVA类实例。 编辑 我想我找到了一些有用的东西创建Java虚拟机 ,但我想知道必须要使用什么值#define USER_CLASSPATH ? 如果必须是包名com.fido.android.framework.service public class Prog { public static void main(String[] args) { System.out.println(“Hello World ” + args[0]); } } #include #define PATH_SEPARATOR ‘;’ /* define it to be ‘:’ on Solaris */ #define USER_CLASSPATH “.” /* where Prog.class is […]

在jni中运行的本机C代码与在Android中的shell中运行之间存在差异

我有一个原生的C Android应用程序。 首先,我将本机C代码构建到共享库中,jni将使用此库。 这个库使用一些内核可加载模块.ko,一些已经加载,一些必须通过“insmod”命令加载。 我还构建了一个使用该库的可执行文件,它通过命令行运行。 但是当它调用需要加载内核模块的函数时,执行与可执行文件相同工作的jni会失败。 那么他们之间有什么区别? 我是否需要授予我的应用程序一些权限?

JNI:无法获得数组长度

我遇到了下一个问题:在C代码中我无法对byte[] (jbyteArray)做任何事情。 在JNI中使用数组的所有函数都会导致JNI DETECTED ERROR IN APPLICATION: jarray argument has non-array type 。 我的代码出了什么问题? C: #include #include static jstring convertToHex(JNIEnv* env, jbyteArray array) { int len = (*env)->GetArrayLength(env, array);// cause an error; return NULL; } static JNINativeMethod methods[] = { {“convertToHex”, “([B)Ljava/lang/String;”, (void*) convertToHex }, }; JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv* env […]