android NDK编译问题,在将项目中的JNI部分编译时,报出了错误,不能成功生成SO文件,
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android NDK编译问题,在将项目中的JNI部分编译时,报出了错误,不能成功生成SO文件,相关的知识,希望对你有一定的参考价值。
报的错误信息如下:
$ $NDK/ndk-build
SharedLibrary : libDeepGuard.so
D:/android/androidndk/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: error: cannot find -lcrypto
D:/android/androidndk/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi/objs/DeepGuard/OpensslWapper.o: in function BNPrintf(bignum_st*):jni/OpensslWapper.cpp:102: error: undefined reference to 'BN_bn2hex'
我的NDK环境配置没有问题,其它项目都可以成功编译,不能为什么这项目在编译时却报缺少一个叫"-lcrypto"文件,哪位大牛遇到过这问题,请问怎么解决,谢谢,急,
你这用什么系统编的啊为什么执行命令看是linux 底下还有D盘
程序里也有错误啊
jni/OpensslWapper.cpp:102: error: undefined reference to \'BN_bn2hex\'追问
我用的Windows系统,你说的缺少一个libcrypto.so库文件,但是这个文件我下载了,并且放到那个文件目录下面了,还是报这样的错误,请指点,谢谢
参考技术A 错误不一定在第一行提示,看看undefined reference to 'BN_bn2hex',没有太多信息无法准确判断 参考技术B 看着想少包了。 参考技术C 进群问吧,25093009一个使用 Eigen 库和 jni 的简单 ndk 项目
【中文标题】一个使用 Eigen 库和 jni 的简单 ndk 项目【英文标题】:A simple ndk project using the Eigen library and jni 【发布时间】:2012-01-22 12:20:35 【问题描述】:所以今天在这里的一些人的帮助下,我整理了一个使用 ndk 的简单 android 应用程序。我将 eigen 库直接导入到我在源代码树中创建的 jni 文件夹中,然后使用 cygwin 我能够编译该项目。这是源代码,因此其他试图学习 jni 基础知识的人将数据从 c++ 来回传递到 java 并返回一些代码。该应用程序仅在 edittext 字段中使用 6 个数字,当用户单击按钮时,两个浮点数组被传递给本机方法并加载到两个特征浮点向量中,然后将它们相加在一起。两个向量的乘积被传回java,然后显示在一个文本视图中。
这是一个指向 android 特征库的链接:
https://bitbucket.org/erublee/eigen-android
您只需要文件树中一层的实际特征文件夹。只需将一层的 eigen 文件夹复制并粘贴到 eigen 源代码中,然后放入您创建的 jni 文件夹中,以将您的 c++ 代码保存在您的 android 项目中。
这是java:
package jnimath.act;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class JnimathActivity extends Activity
/** Called when the activity is first created. */
public EditText x;
public EditText y;
public EditText z;
public EditText x2;
public EditText y2;
public EditText z2;
public float[] vecArray;
public TextView textView1;
public Button run;
float[] array3 = new float[3];
float[] array1 = new float[3];
float[] array2 = new float[3];
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
x = (EditText)findViewById(R.id.x);
y = (EditText)findViewById(R.id.y);
z = (EditText)findViewById(R.id.z);
x2 = (EditText)findViewById(R.id.x);
y2 = (EditText)findViewById(R.id.y);
z2 = (EditText)findViewById(R.id.z);
textView1 = (TextView)findViewById(R.id.textView1);
run = (Button)findViewById(R.id.run);
run.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
array1[0] = Float.parseFloat(x.getText().toString());
array1[1] = Float.parseFloat(y.getText().toString());
array1[2] = Float.parseFloat(z.getText().toString());
array2[0] = Float.parseFloat(x2.getText().toString());
array2[1] = Float.parseFloat(y2.getText().toString());
array2[2] = Float.parseFloat(z2.getText().toString());
array3 = test(array1, array2);
String text = array3[0]+" "+array3[1]+" "+array3[2];
textView1.setText(text);
);
public native float[] test(float[] array1, float[] array2);
static
System.loadLibrary("test");
还有 C++ 代码:
#include <iostream>
#include <Eigen/Dense>
#include <math.h>
#include <jni.h>
using namespace Eigen;
Vector3f vec;
Vector3f vec2;
Vector3f vecRtrn;
void vecLoad(float x, float y, float z, float x2, float y2, float z2)
vec(0) = x;
vec(1) = y;
vec(2) = z;
vec2(0) = x2;
vec2(1) = y2;
vec2(2) = z2;
void vecAdd(Vector3f vecA, Vector3f vecB)
vecRtrn = vecA + vecB;
extern "C"
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2)
jfloatArray result;
result = env->NewFloatArray(3);
if (result == NULL)
return NULL; /* out of memory error thrown */
jfloat array1[3];
jfloat* flt1 = env->GetFloatArrayElements( fltarray1,0);
jfloat* flt2 = env->GetFloatArrayElements( fltarray2,0);
vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]);
vecAdd(vec, vec2);
array1[0] = vecRtrn[0];
array1[1] = vecRtrn[1];
array1[2] = vecRtrn[2];
env->ReleaseFloatArrayElements(fltarray1, flt1, 0);
env->ReleaseFloatArrayElements(fltarray2, flt2, 0);
env->SetFloatArrayRegion(result, 0, 3, array1);
return result;
现在是 Android.mk 文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)
您还需要设置一个 Application.mk 以便您可以使用 stl 来使用 eigen:
APP_STL := stlport_static
最后但并非最不重要的是布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<TextView
android:layout_
android:layout_
android:text="@string/hello" />
<EditText
android:id="@+id/x"
android:layout_
android:layout_
android:hint="z" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/y"
android:layout_
android:layout_
android:hint="y" />
<EditText
android:id="@+id/z"
android:layout_
android:layout_
android:hint="z" />
<EditText
android:id="@+id/x2"
android:layout_
android:layout_
android:hint="x2" />
<EditText
android:id="@+id/y2"
android:layout_
android:layout_
android:hint="y2" />
<EditText
android:id="@+id/z2"
android:layout_
android:layout_
android:hint="z2" />
<Button
android:id="@+id/run"
android:layout_
android:layout_
android:text="run" />
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:text="matrix output" />
</LinearLayout>
我实际上使用 cygwin 来使用 ndk-build 命令,但您现在可以使用旧的 Windows 命令行来做同样的事情。继续并以此为示例,学习如何使用 ndk 将一些数据从 java 传递到 c++。肯定严重缺乏关于此事的真正好的文件。此外,如果您希望使用快速的本地数学库,请在此链接中查看 eigen:
http://eigen.tuxfamily.org/index.php?title=Main_Page
我希望这些东西可以帮助一些人,就像它帮助我学习如何将数据从 java 传递到本机端并返回:)
【问题讨论】:
这很有帮助!谢谢 不用担心 :) 我花了两天时间才弄清楚如何使用 JNI 以我需要的方式来回获取数据,所以我认为它可以帮助其他人了解我是如何工作的. 发布内容作为答案并接受! ;) 【参考方案1】:所以这让我开始能够从 java 到 c++ 来回传递值,但这里有一个非常棒的关于 ndk 的完整教程
http://code.google.com/p/awesomeguy/wiki/JNITutorial
我从那里捡了一堆东西,还有这本书
http://www.amazon.com/Android-Beginners-Guide-Sylvain-Ratabouil/dp/1849691525
【讨论】:
以上是关于android NDK编译问题,在将项目中的JNI部分编译时,报出了错误,不能成功生成SO文件,的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK编译之undefined reference to 'JNI_CreateJavaVM'