【发布时间】:2016-01-11 06:35:30
【问题描述】:
我在 Eclipse 中使用 android ndk。我编译了我的项目,但在运行时遇到错误。我有libcrytpoNative.so 和libsslNative.so 文件,但我收到关于libcrypto.so.1.0.0 未找到错误的错误。我应该如何解决这个问题?
这是ndk-build V=1的输出
Android NDK: WARNING: APP_PLATFORM android-21 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml
rm -f ./libs/arm64-v8a/lib*.so ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so ./libs/mips64/lib*.so ./libs/x86/lib*.so ./libs/x86_64/lib*.so
rm -f ./libs/arm64-v8a/gdbserver ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/mips64/gdbserver ./libs/x86/gdbserver ./libs/x86_64/gdbserver
rm -f ./libs/arm64-v8a/gdb.setup ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/mips64/gdb.setup ./libs/x86/gdb.setup ./libs/x86_64/gdb.setup
[armeabi-v7a] Install : libcpabe.so => libs/armeabi-v7a/libcpabe.so
install -p ./obj/local/armeabi-v7a/libcpabe.so ./libs/armeabi-v7a/libcpabe.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libcpabe.so
[armeabi-v7a] Install : libcryptoNative.so => libs/armeabi-v7a/libcryptoNative.so
install -p ./obj/local/armeabi-v7a/libcryptoNative.so ./libs/armeabi-v7a/libcryptoNative.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libcryptoNative.so
[armeabi-v7a] Install : libglib.so => libs/armeabi-v7a/libglib.so
install -p ./obj/local/armeabi-v7a/libglib.so ./libs/armeabi-v7a/libglib.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libglib.so
[armeabi-v7a] Install : libgmp.so => libs/armeabi-v7a/libgmp.so
install -p ./obj/local/armeabi-v7a/libgmp.so ./libs/armeabi-v7a/libgmp.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libgmp.so
[armeabi-v7a] Install : libpbc.so => libs/armeabi-v7a/libpbc.so
install -p ./obj/local/armeabi-v7a/libpbc.so ./libs/armeabi-v7a/libpbc.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libpbc.so
[armeabi-v7a] Install : libsslNative.so => libs/armeabi-v7a/libsslNative.so
install -p ./obj/local/armeabi-v7a/libsslNative.so ./libs/armeabi-v7a/libsslNative.so
/home/yogi/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libsslNative.so
这是加载库的 MainActivity.java:
包 com.example.myproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity {
static {
System.loadLibrary("gmp");
// System.loadLibrary("ssl");
// System.loadLibrary("crypto");
System.loadLibrary("glib");
System.loadLibrary("pbc");
System.loadLibrary("sslNative");
System.loadLibrary("cryptoNative");
System.loadLibrary("cpabe");
}
//System.loadLibrary("ssl_static");
public static native void InitMainActivityjni();
public native String cpabeNative();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
TextView tv = new TextView(this);
tv.setText(cpabeNative());
setContentView(tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
谢谢
【问题讨论】:
-
在运行时加载这些库的行是什么?在(至少)您的一个 java 文件中,您应该有类似
System.loadLibray(libname)的内容。 -
另见Changing OpenSSL library in Android app for HttpClient。它讨论了 Zygote 以及提供您自己的
libcrytpo.so和libssl.so副本的问题。 -
@sonic: System.loadLibray("ssl"); System.loadLibray("crypto");
-
进入命令行,手动运行
ndk-build V=1。然后,将结果发布到 Pastebin。 (Stack Overflow 有类似 Pastebin 的服务吗?) -
@jww:是的,正如你提到的,我猜它是用 system/openssl 初始化的。我觉得从你的回答中理解起来太复杂了。如果可能的话,你能分享 armeabi-v7 的文件吗?抱歉给您添麻烦
标签: android-ndk openssl