Android System.loadLibrary崩溃

时间:2016-02-15 04:54:34

标签: java android c java-native-interface android-studio-import

我正在尝试将c fileImageProc包含到我的java文件中以使用它的函数。

我从MjpegInputStream file得到了代码(其中一切都应该有效,但当然它从未如此简单)

这是崩溃的代码(以某种方式抓住它没有抓住它)

static {
    try {
        System.loadLibrary("ImageProc");
    }
    catch (Exception e){
        e.getMessage();
    }
}

makefile是:

include $(CLEAR_VARS)
LOCAL_MODULE    := ImageProc
LOCAL_SRC_FILES := ImageProc.c
LOCAL_LDLIBS    := -llog -ljnigraphics
LOCAL_SHARED_LIBRARIES := prebuilt-libjpeg
LOCAL_C_INCLUDES       := external/include jni/external/include

据我了解,我应该能够使用ImageProc

我知道它经历并编译了c file,因为起初它找不到h文件引用(现在修复)。

我不确定的另一件事是我调用c文件中定义为pixeltobmp的函数Java_com_camera_simplemjpeg_MjpegInputStream_pixeltobmp,这让我觉得很奇怪。我尝试更改方法的名称以包含我正在使用的包而不是我从中复制的包,但这并没有解决任何问题。

感谢任何帮助。

其他信息:我正在使用gradle build 2.10

3 个答案:

答案 0 :(得分:1)

 1. Compile your library
 2. Check if you have the .so compiled library(this is important!)
 3. In your gradle file add this:

      android {  
        compileSdkVersion 23
            buildToolsVersion "22.0.1"

            defaultConfig {
                minSdkVersion 18
                    targetSdkVersion 23
                    versionCode 1
                    versionName "1.0"
                }

                sourceSets.main {
                    jni.srcDirs = []
                    File configFile = file('pathToYourLibsFolder')
                    jniLibs.srcDir configFile.absolutePath
                }

然后它应该工作。

答案 1 :(得分:0)

在build.gradle中

apply plugin: 'com.android.application'
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        defaultConfig {
           ...
        }
        buildTypes {
            ...
        }
        ndk {
            moduleName "ImageProc"
            // stl "stlport_static"
            // ldLibs "log"
        }
    }

}

答案 2 :(得分:0)

作为一种替代选择,可以轻松地修改您正在使用的代码,以消除对OpenCV的依赖(或者现在可以在问了问题2年后)。

MjpegInputStream.java有两种相关方法,readMjpegFrame()readMjpegFrame(Bitmap bmp)

仅后者依赖OpenCV,因此依赖于本机库。如果您修改代码以删除此方法,然后删除:

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

public native int pixeltobmp(byte[] jp, int l, Bitmap bmp);

public native void freeCameraMemory();

您将不再遇到此问题,并且仍然可以使用readMjpegFrame()来获取所需的内容。

这是否性能较低,我不确定,但是在我的用例中效果很好。