我有一些Android的C代码,可以进行大量的低级数字运算.我想知道我应该使用哪些设置(例如我的Android.mk和Application.mk),以便生成的代码可以在所有当前的Android设备上运行,但也可以利用特定芯片组的优化.我正在寻找使用良好的默认Android.mk和Application.mk设置,我想避免使用#ifdef分支丢弃我的C代码.
例如,我知道ARMv7有浮点指令,一些ARMv7芯片支持NEON指令,默认ARM不支持这些指令.是否可以设置标志,以便我可以使用NEON,没有NEON的ARMv7和默认的ARM构建来构建ARMv7?我知道如何做后两者但不是全部3.我对我使用的设置持谨慎态度,因为我认为当前默认设置是最安全的设置以及其他选项有哪些风险.
对于GCC特定的优化,我使用以下标志:
LOCAL_CFLAGS=-ffast-math -O3 -funroll-loops
Run Code Online (Sandbox Code Playgroud)
我检查了所有这三个加速了我的代码.还有其他我可以添加的常见内容吗?
我的另一个提示是将"LOCAL_ARM_MODE:= arm"添加到Android.mk以加快更新的手臂芯片(尽管我对这件事以及旧芯片上发生的事情感到困惑).
我不能叫rJava包R 3.0.我收到以下消息
Error: package ‘rJava’ was built before R 3.0.0: please re-install it
Run Code Online (Sandbox Code Playgroud)
我试图重新安装rJava包时遇到错误.我提供了输出R CMD javareconf
Java interpreter : /usr/bin/java
Java version : 1.7.0_21
Java home path : /usr/lib/jvm/java-7-openjdk-i386/jre
Java compiler : /usr/lib/jvm/java-7-openjdk-i386/jre/../bin/javac
Java headers gen.: /usr/lib/jvm/java-7-openjdk-i386/jre/../bin/javah
Java archive tool: /usr/lib/jvm/java-7-openjdk-i386/jre/../bin/jar
trying to compile and link a JNI progam
detected JNI cpp flags :
detected JNI linker flags :
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -fpic -O2 -pipe -g -c conftest.c -o conftest.o
conftest.c:1:17: fatal …Run Code Online (Sandbox Code Playgroud) 我需要使用NDK和JNI将一些函数实现到Android应用程序中.
以下是我编写的C代码,我的问题是:
#include <jni.h>
#include <stdio.h>
jobject
Java_com_example_ndktest_NDKTest_ImageRef(JNIEnv* env, jobject obj, jint width, jint height, jbyteArray myArray)
{
jint i;
jobject object;
jmethodID constructor;
jobject cls;
cls = (*env)->FindClass(env, "com/example/ndktest/NDKTest/Point");
//what should put as the second parameter? Is my try correct, according to what
//you can find in .java file? I used this documentation: http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16027
constructor = (*env)->GetMethodID(env, cls, "<init>", "void(V)");
//http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16660
//Again, is the last parameter ok?
object = (*env)->NewObject(env, cls, constructor, 5, 6);
//I want to assign "5" …Run Code Online (Sandbox Code Playgroud) 我正在进行的项目要求我编写跨平台程序实现的android部分.
构建了一组核心功能,并将其包含在我的应用程序中android-ndk.我发现在本机代码中发生的任何异常/崩溃只会在现在和最后再次报告.发生错误时,我会收到以下行为之一:
NullPointerException(通常在每个本机代码异常的相同位置,这是一个巨大的痛苦).通常会让我花费一段时间来尝试调试为什么Java代码抛出错误只是为了发现Java代码很好并且本机代码错误已被完全掩盖.我似乎无法找到任何方法来"隔离"我的代码以防止在本机代码中发生的错误.Try/catch语句被彻底忽略了.除了我的代码被指责为罪魁祸首之外,我甚至没有机会警告用户而不是发生错误.
有人可以帮我解决如何应对崩溃本机代码的情况吗?
java-native-interface android exception-handling nullpointerexception android-ndk
您的Android JNI应用中出现上述错误?继续阅读......
在前面,我会说我已经用我自己的方式解决了这个问题,但是我觉得Android构建系统中的某些内容(可能是关于Eclipse)已经破了,我希望能够为其他人节省数小时的痛苦.也许其他人已经遇到过这个问题,可以评论对他们有用的东西.
有一段时间,我有一个Android项目,其中包含一些我使用NDK开发的JNI代码.然后,今天,我在java代码中改变了一些东西,然后poof,我再也无法加载我的JNI库了.它失败了,例如:
E/AndroidRuntime(999):java.lang.UnsatisfiedLinkError:无法加载mylibrary:findLibrary返回null
我用Google搜索并尝试了所有内容(重建,关闭和重新启动Eclipse等等)
什么最终解决了我的问题?在尝试另一次运行之前,我从设备上物理卸载了我的应用程序.而已.在那之后,它奏效了.什么对你有用?
我正在尝试使用Java中的SVMLight,在此页面上使用JNI包装器:
static {
System.loadLibrary("lib/JNI_SVM-light-6.01/lib/svmlight");
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
... lib\JNI_SVM-light-6.01\lib\svmlight.dll:无法在AMD 64位平台上加载IA 32位.dll
我可以通过重新编译64位的.dll来解决这个问题吗?我该怎么做呢?我可以使用其他一些解决方法吗?SVMLight使C源代码可用.
嗨,有人能建议我学习JNI for Android和一些优秀的JNI教程吗?
虽然有关于把一个文件jstring到本地字符串(string nativeString = env->GetStringUTFChars(jStringVariable, NULL);)我找不到这将转换为一个例子jboolean,以一个bool或jint一个int.
谁能建议如何实现这一目标?
我需要创建一个Android应用程序,它包含在Unity3d(动画等)和AndroidSDK上编写的部分(通过androidSDK,我的意思是很少用java,manifest和资源编写的活动)
事实上我已经有了这些部分(至少模拟已经准备好了=))我无法弄清楚如何在它们之间进行通信.
我已经阅读了很多关于unity3d android集成的文章(主要是关于称为"插件"的东西)并且无法理解这个人员的工作原理=(我理解的主要内容(每个人都知道官方参考文章写过)是关于插件的文档非常差... =)
我能理解的唯一通信方式是使用unity3d脚本(使用AndroidJavaClass和AndroidJavaObject)进行意图(广播),这样我的活动(用java编写)就可以处理它.但有些东西告诉我这不是最好的解决方案......
我读到的问题是我需要使用JNI(这是java本机接口 - 为什么?!? - 为什么我需要使用本机代码?)
我是否需要在java上创建一些中级代码,目的是与我的java活动进行通信,使用AndroidNDK编译它并作为插件包含在我的Unity3d项目中?我怎么能写中间层呢?我是否需要使用UnityPlayer而不是"Activity"作为基类?为什么?
大多数时候,在Android上获取OOM是由于使用了太多位图和/或创建大位图.
最近我决定试用JNI,以便通过将数据本身存储在JNI端来避免OOM.
在与JNI搞砸了一段时间后,我在SO上创建了一些帖子,寻求帮助并分享我的知识,现在我决定与你分享更多代码.如果有人有兴趣阅读调查结果或做出贡献,这里有帖子:
这一次,我添加了存储,恢复,裁剪和旋转位图的功能.它应该很容易添加更多选项,如果其他人在这里将自己的代码添加到更有用的功能,我会很高兴.
所以我要展示的代码实际上是合并了我创造的所有东西.
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
final int width=bitmap.getWidth(),height=bitmap.getHeight();
// store the bitmap in the JNI "world"
final JniBitmapHolder bitmapHolder=new JniBitmapHolder(bitmap);
// no need for the bitmap on the java "world", since the operations are done on the JNI "world"
bitmap.recycle();
// crop a center square from the bitmap, from (0.25,0.25) to (0.75,0.75) of the bitmap.
bitmapHolder.cropBitmap(width/4,height/4,width*3/4,height*3/4);
//rotate the bitmap:
bitmapHolder.rotateBitmapCcw90();
//get the output java bitmap , …Run Code Online (Sandbox Code Playgroud) java-native-interface android bitmap out-of-memory android-ndk